@protontech/drive-sdk 0.4.1 → 0.5.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/diagnostic/{sdkDiagnosticFull.d.ts → diagnostic.d.ts} +5 -4
- package/dist/diagnostic/{sdkDiagnosticFull.js → diagnostic.js} +13 -10
- package/dist/diagnostic/diagnostic.js.map +1 -0
- package/dist/diagnostic/index.js +2 -4
- package/dist/diagnostic/index.js.map +1 -1
- package/dist/diagnostic/interface.d.ts +22 -1
- package/dist/diagnostic/sdkDiagnostic.d.ts +3 -2
- package/dist/diagnostic/sdkDiagnostic.js +80 -8
- package/dist/diagnostic/sdkDiagnostic.js.map +1 -1
- package/dist/interface/download.d.ts +4 -4
- package/dist/interface/index.d.ts +1 -1
- package/dist/interface/index.js.map +1 -1
- package/dist/interface/nodes.d.ts +9 -0
- package/dist/interface/telemetry.d.ts +4 -1
- package/dist/interface/telemetry.js.map +1 -1
- package/dist/interface/upload.d.ts +6 -3
- package/dist/internal/apiService/apiService.d.ts +3 -0
- package/dist/internal/apiService/apiService.js +25 -2
- package/dist/internal/apiService/apiService.js.map +1 -1
- package/dist/internal/apiService/apiService.test.js +38 -0
- package/dist/internal/apiService/apiService.test.js.map +1 -1
- package/dist/internal/apiService/driveTypes.d.ts +2595 -2397
- package/dist/internal/apiService/errors.js +3 -0
- package/dist/internal/apiService/errors.js.map +1 -1
- package/dist/internal/apiService/errors.test.js +15 -7
- package/dist/internal/apiService/errors.test.js.map +1 -1
- package/dist/internal/asyncIteratorMap.d.ts +1 -1
- package/dist/internal/asyncIteratorMap.js +6 -1
- package/dist/internal/asyncIteratorMap.js.map +1 -1
- package/dist/internal/asyncIteratorMap.test.js +9 -0
- package/dist/internal/asyncIteratorMap.test.js.map +1 -1
- package/dist/internal/download/controller.d.ts +2 -0
- package/dist/internal/download/controller.js +15 -1
- package/dist/internal/download/controller.js.map +1 -1
- package/dist/internal/download/fileDownloader.d.ts +3 -3
- package/dist/internal/download/fileDownloader.js +11 -6
- package/dist/internal/download/fileDownloader.js.map +1 -1
- package/dist/internal/download/fileDownloader.test.js +8 -8
- package/dist/internal/download/fileDownloader.test.js.map +1 -1
- package/dist/internal/nodes/apiService.d.ts +6 -1
- package/dist/internal/nodes/apiService.js +71 -44
- package/dist/internal/nodes/apiService.js.map +1 -1
- package/dist/internal/nodes/apiService.test.js +204 -15
- package/dist/internal/nodes/apiService.test.js.map +1 -1
- package/dist/internal/nodes/debouncer.d.ts +24 -0
- package/dist/internal/nodes/debouncer.js +92 -0
- package/dist/internal/nodes/debouncer.js.map +1 -0
- package/dist/internal/nodes/debouncer.test.d.ts +1 -0
- package/dist/internal/nodes/debouncer.test.js +108 -0
- package/dist/internal/nodes/debouncer.test.js.map +1 -0
- package/dist/internal/nodes/extendedAttributes.js +2 -2
- package/dist/internal/nodes/extendedAttributes.js.map +1 -1
- package/dist/internal/nodes/index.js +1 -1
- package/dist/internal/nodes/index.js.map +1 -1
- package/dist/internal/nodes/nodesAccess.d.ts +6 -4
- package/dist/internal/nodes/nodesAccess.js +29 -9
- package/dist/internal/nodes/nodesAccess.js.map +1 -1
- package/dist/internal/nodes/nodesAccess.test.js +19 -7
- package/dist/internal/nodes/nodesAccess.test.js.map +1 -1
- package/dist/internal/nodes/nodesManagement.d.ts +2 -2
- package/dist/internal/nodes/nodesManagement.js +5 -3
- package/dist/internal/nodes/nodesManagement.js.map +1 -1
- package/dist/internal/nodes/nodesManagement.test.js +3 -1
- package/dist/internal/nodes/nodesManagement.test.js.map +1 -1
- package/dist/internal/photos/apiService.js +9 -20
- package/dist/internal/photos/apiService.js.map +1 -1
- package/dist/internal/photos/upload.d.ts +2 -1
- package/dist/internal/photos/upload.js +9 -3
- package/dist/internal/photos/upload.js.map +1 -1
- package/dist/internal/sharing/apiService.d.ts +1 -1
- package/dist/internal/sharing/apiService.js +2 -2
- package/dist/internal/sharing/apiService.js.map +1 -1
- package/dist/internal/sharing/sharingManagement.d.ts +4 -1
- package/dist/internal/sharing/sharingManagement.js +7 -4
- package/dist/internal/sharing/sharingManagement.js.map +1 -1
- package/dist/internal/sharingPublic/apiService.d.ts +8 -10
- package/dist/internal/sharingPublic/apiService.js +9 -125
- package/dist/internal/sharingPublic/apiService.js.map +1 -1
- package/dist/internal/sharingPublic/cryptoReporter.d.ts +16 -0
- package/dist/internal/sharingPublic/{cryptoService.js → cryptoReporter.js} +3 -16
- package/dist/internal/sharingPublic/cryptoReporter.js.map +1 -0
- package/dist/internal/sharingPublic/index.d.ts +22 -4
- package/dist/internal/sharingPublic/index.js +37 -12
- package/dist/internal/sharingPublic/index.js.map +1 -1
- package/dist/internal/sharingPublic/nodes.d.ts +18 -0
- package/dist/internal/sharingPublic/nodes.js +46 -0
- package/dist/internal/sharingPublic/nodes.js.map +1 -0
- package/dist/internal/sharingPublic/session/apiService.d.ts +7 -5
- package/dist/internal/sharingPublic/session/apiService.js +25 -4
- package/dist/internal/sharingPublic/session/apiService.js.map +1 -1
- package/dist/internal/sharingPublic/session/interface.d.ts +17 -0
- package/dist/internal/sharingPublic/session/manager.d.ts +12 -4
- package/dist/internal/sharingPublic/session/manager.js +14 -4
- package/dist/internal/sharingPublic/session/manager.js.map +1 -1
- package/dist/internal/sharingPublic/session/session.d.ts +7 -4
- package/dist/internal/sharingPublic/session/session.js +7 -3
- package/dist/internal/sharingPublic/session/session.js.map +1 -1
- package/dist/internal/sharingPublic/session/url.test.js +3 -3
- package/dist/internal/sharingPublic/shares.d.ts +27 -0
- package/dist/internal/sharingPublic/shares.js +46 -0
- package/dist/internal/sharingPublic/shares.js.map +1 -0
- package/dist/internal/upload/apiService.js +10 -1
- package/dist/internal/upload/apiService.js.map +1 -1
- package/dist/internal/upload/controller.d.ts +11 -3
- package/dist/internal/upload/controller.js +16 -2
- package/dist/internal/upload/controller.js.map +1 -1
- package/dist/internal/upload/fileUploader.d.ts +6 -3
- package/dist/internal/upload/fileUploader.js +4 -4
- package/dist/internal/upload/fileUploader.js.map +1 -1
- package/dist/internal/upload/fileUploader.test.js +23 -11
- package/dist/internal/upload/fileUploader.test.js.map +1 -1
- package/dist/internal/upload/streamUploader.d.ts +9 -4
- package/dist/internal/upload/streamUploader.js +67 -20
- package/dist/internal/upload/streamUploader.js.map +1 -1
- package/dist/internal/upload/streamUploader.test.js +43 -13
- package/dist/internal/upload/streamUploader.test.js.map +1 -1
- package/dist/protonDriveClient.d.ts +11 -6
- package/dist/protonDriveClient.js +11 -10
- package/dist/protonDriveClient.js.map +1 -1
- package/dist/protonDrivePublicLinkClient.d.ts +34 -6
- package/dist/protonDrivePublicLinkClient.js +52 -9
- package/dist/protonDrivePublicLinkClient.js.map +1 -1
- package/dist/tests/telemetry.d.ts +4 -2
- package/dist/tests/telemetry.js +3 -1
- package/dist/tests/telemetry.js.map +1 -1
- package/dist/transformers.d.ts +3 -2
- package/dist/transformers.js +6 -0
- package/dist/transformers.js.map +1 -1
- package/package.json +1 -1
- package/src/diagnostic/{sdkDiagnosticFull.ts → diagnostic.ts} +10 -6
- package/src/diagnostic/index.ts +3 -5
- package/src/diagnostic/interface.ts +39 -0
- package/src/diagnostic/sdkDiagnostic.ts +111 -10
- package/src/interface/download.ts +4 -4
- package/src/interface/index.ts +1 -0
- package/src/interface/nodes.ts +3 -0
- package/src/interface/telemetry.ts +5 -0
- package/src/interface/upload.ts +3 -3
- package/src/internal/apiService/apiService.test.ts +50 -0
- package/src/internal/apiService/apiService.ts +33 -2
- package/src/internal/apiService/driveTypes.ts +2713 -2561
- package/src/internal/apiService/errors.test.ts +10 -0
- package/src/internal/apiService/errors.ts +5 -1
- package/src/internal/asyncIteratorMap.test.ts +12 -0
- package/src/internal/asyncIteratorMap.ts +8 -0
- package/src/internal/download/controller.ts +13 -1
- package/src/internal/download/fileDownloader.test.ts +8 -8
- package/src/internal/download/fileDownloader.ts +13 -6
- package/src/internal/nodes/apiService.test.ts +261 -14
- package/src/internal/nodes/apiService.ts +99 -65
- package/src/internal/nodes/debouncer.test.ts +141 -0
- package/src/internal/nodes/debouncer.ts +109 -0
- package/src/internal/nodes/extendedAttributes.ts +2 -2
- package/src/internal/nodes/index.ts +1 -8
- package/src/internal/nodes/nodesAccess.test.ts +19 -7
- package/src/internal/nodes/nodesAccess.ts +44 -9
- package/src/internal/nodes/nodesManagement.test.ts +3 -1
- package/src/internal/nodes/nodesManagement.ts +11 -5
- package/src/internal/photos/apiService.ts +12 -29
- package/src/internal/photos/upload.ts +22 -1
- package/src/internal/sharing/apiService.ts +2 -2
- package/src/internal/sharing/sharingManagement.ts +7 -4
- package/src/internal/sharingPublic/apiService.ts +23 -160
- package/src/internal/sharingPublic/{cryptoService.ts → cryptoReporter.ts} +2 -27
- package/src/internal/sharingPublic/index.ts +76 -13
- package/src/internal/sharingPublic/nodes.ts +59 -0
- package/src/internal/sharingPublic/session/apiService.ts +32 -10
- package/src/internal/sharingPublic/session/interface.ts +20 -0
- package/src/internal/sharingPublic/session/manager.ts +31 -8
- package/src/internal/sharingPublic/session/session.ts +12 -7
- package/src/internal/sharingPublic/session/url.test.ts +3 -3
- package/src/internal/sharingPublic/shares.ts +50 -0
- package/src/internal/upload/apiService.ts +12 -1
- package/src/internal/upload/controller.ts +16 -4
- package/src/internal/upload/fileUploader.test.ts +25 -11
- package/src/internal/upload/fileUploader.ts +6 -5
- package/src/internal/upload/streamUploader.test.ts +56 -12
- package/src/internal/upload/streamUploader.ts +78 -20
- package/src/protonDriveClient.ts +29 -11
- package/src/protonDrivePublicLinkClient.ts +100 -16
- package/src/tests/telemetry.ts +6 -3
- package/src/transformers.ts +8 -0
- package/dist/diagnostic/sdkDiagnosticFull.js.map +0 -1
- package/dist/internal/sharingPublic/cryptoCache.d.ts +0 -19
- package/dist/internal/sharingPublic/cryptoCache.js +0 -72
- package/dist/internal/sharingPublic/cryptoCache.js.map +0 -1
- package/dist/internal/sharingPublic/cryptoService.d.ts +0 -9
- package/dist/internal/sharingPublic/cryptoService.js.map +0 -1
- package/dist/internal/sharingPublic/interface.d.ts +0 -6
- package/dist/internal/sharingPublic/interface.js +0 -3
- package/dist/internal/sharingPublic/interface.js.map +0 -1
- package/dist/internal/sharingPublic/manager.d.ts +0 -19
- package/dist/internal/sharingPublic/manager.js +0 -81
- package/dist/internal/sharingPublic/manager.js.map +0 -1
- package/src/internal/sharingPublic/cryptoCache.ts +0 -79
- package/src/internal/sharingPublic/interface.ts +0 -14
- package/src/internal/sharingPublic/manager.ts +0 -86
|
@@ -1,18 +1,31 @@
|
|
|
1
|
+
import { MemoryCache } from './cache';
|
|
1
2
|
import { getConfig } from './config';
|
|
2
|
-
import { DriveCrypto, OpenPGPCrypto, SRPModule, SessionKey } from './crypto';
|
|
3
|
+
import { DriveCrypto, OpenPGPCrypto, PrivateKey, SRPModule, SessionKey } from './crypto';
|
|
3
4
|
import {
|
|
4
5
|
ProtonDriveHTTPClient,
|
|
5
6
|
ProtonDriveTelemetry,
|
|
6
7
|
ProtonDriveConfig,
|
|
7
8
|
Logger,
|
|
8
|
-
ProtonDriveCryptoCache,
|
|
9
9
|
NodeOrUid,
|
|
10
10
|
ProtonDriveAccount,
|
|
11
11
|
MaybeNode,
|
|
12
|
+
NodeType,
|
|
13
|
+
CachedCryptoMaterial,
|
|
14
|
+
MaybeMissingNode,
|
|
15
|
+
FileDownloader,
|
|
16
|
+
ThumbnailType,
|
|
17
|
+
ThumbnailResult,
|
|
12
18
|
} from './interface';
|
|
13
19
|
import { Telemetry } from './telemetry';
|
|
14
|
-
import {
|
|
20
|
+
import {
|
|
21
|
+
getUid,
|
|
22
|
+
convertInternalNodePromise,
|
|
23
|
+
convertInternalNodeIterator,
|
|
24
|
+
convertInternalMissingNodeIterator,
|
|
25
|
+
getUids,
|
|
26
|
+
} from './transformers';
|
|
15
27
|
import { DriveAPIService } from './internal/apiService';
|
|
28
|
+
import { initDownloadModule } from './internal/download';
|
|
16
29
|
import { SDKEvents } from './internal/sdkEvents';
|
|
17
30
|
import { initSharingPublicModule } from './internal/sharingPublic';
|
|
18
31
|
|
|
@@ -33,6 +46,7 @@ export class ProtonDrivePublicLinkClient {
|
|
|
33
46
|
private logger: Logger;
|
|
34
47
|
private sdkEvents: SDKEvents;
|
|
35
48
|
private sharingPublic: ReturnType<typeof initSharingPublicModule>;
|
|
49
|
+
private download: ReturnType<typeof initDownloadModule>;
|
|
36
50
|
|
|
37
51
|
public experimental: {
|
|
38
52
|
/**
|
|
@@ -53,30 +67,36 @@ export class ProtonDrivePublicLinkClient {
|
|
|
53
67
|
|
|
54
68
|
constructor({
|
|
55
69
|
httpClient,
|
|
56
|
-
cryptoCache,
|
|
57
70
|
account,
|
|
58
71
|
openPGPCryptoModule,
|
|
59
72
|
srpModule,
|
|
60
73
|
config,
|
|
61
74
|
telemetry,
|
|
75
|
+
url,
|
|
62
76
|
token,
|
|
63
|
-
|
|
77
|
+
publicShareKey,
|
|
78
|
+
publicRootNodeUid,
|
|
64
79
|
}: {
|
|
65
80
|
httpClient: ProtonDriveHTTPClient;
|
|
66
|
-
cryptoCache: ProtonDriveCryptoCache;
|
|
67
81
|
account: ProtonDriveAccount;
|
|
68
82
|
openPGPCryptoModule: OpenPGPCrypto;
|
|
69
83
|
srpModule: SRPModule;
|
|
70
84
|
config?: ProtonDriveConfig;
|
|
71
85
|
telemetry?: ProtonDriveTelemetry;
|
|
86
|
+
url: string;
|
|
72
87
|
token: string;
|
|
73
|
-
|
|
88
|
+
publicShareKey: PrivateKey;
|
|
89
|
+
publicRootNodeUid: string;
|
|
74
90
|
}) {
|
|
75
91
|
if (!telemetry) {
|
|
76
92
|
telemetry = new Telemetry();
|
|
77
93
|
}
|
|
78
94
|
this.logger = telemetry.getLogger('interface');
|
|
79
95
|
|
|
96
|
+
// Use only in memory cache for public link as there are no events to keep it up to date if persisted.
|
|
97
|
+
const entitiesCache = new MemoryCache<string>();
|
|
98
|
+
const cryptoCache = new MemoryCache<CachedCryptoMaterial>();
|
|
99
|
+
|
|
80
100
|
const fullConfig = getConfig(config);
|
|
81
101
|
this.sdkEvents = new SDKEvents(telemetry);
|
|
82
102
|
|
|
@@ -87,26 +107,37 @@ export class ProtonDrivePublicLinkClient {
|
|
|
87
107
|
fullConfig.baseUrl,
|
|
88
108
|
fullConfig.language,
|
|
89
109
|
);
|
|
90
|
-
const
|
|
110
|
+
const cryptoModule = new DriveCrypto(openPGPCryptoModule, srpModule);
|
|
91
111
|
this.sharingPublic = initSharingPublicModule(
|
|
92
112
|
telemetry,
|
|
93
113
|
apiService,
|
|
114
|
+
entitiesCache,
|
|
94
115
|
cryptoCache,
|
|
95
|
-
|
|
116
|
+
cryptoModule,
|
|
96
117
|
account,
|
|
118
|
+
url,
|
|
97
119
|
token,
|
|
98
|
-
|
|
120
|
+
publicShareKey,
|
|
121
|
+
publicRootNodeUid,
|
|
122
|
+
);
|
|
123
|
+
this.download = initDownloadModule(
|
|
124
|
+
telemetry,
|
|
125
|
+
apiService,
|
|
126
|
+
cryptoModule,
|
|
127
|
+
account,
|
|
128
|
+
this.sharingPublic.shares,
|
|
129
|
+
this.sharingPublic.nodes.access,
|
|
130
|
+
this.sharingPublic.nodes.revisions,
|
|
99
131
|
);
|
|
100
132
|
|
|
101
133
|
this.experimental = {
|
|
102
134
|
getNodeUrl: async (nodeUid: NodeOrUid) => {
|
|
103
135
|
this.logger.debug(`Getting node URL for ${getUid(nodeUid)}`);
|
|
104
|
-
|
|
105
|
-
return '';
|
|
136
|
+
return this.sharingPublic.nodes.access.getNodeUrl(getUid(nodeUid));
|
|
106
137
|
},
|
|
107
138
|
getDocsKey: async (nodeUid: NodeOrUid) => {
|
|
108
139
|
this.logger.debug(`Getting docs keys for ${getUid(nodeUid)}`);
|
|
109
|
-
const keys = await this.sharingPublic.getNodeKeys(getUid(nodeUid));
|
|
140
|
+
const keys = await this.sharingPublic.nodes.access.getNodeKeys(getUid(nodeUid));
|
|
110
141
|
if (!keys.contentKeyPacketSessionKey) {
|
|
111
142
|
throw new Error('Node does not have a content key packet session key');
|
|
112
143
|
}
|
|
@@ -120,7 +151,8 @@ export class ProtonDrivePublicLinkClient {
|
|
|
120
151
|
*/
|
|
121
152
|
async getRootNode(): Promise<MaybeNode> {
|
|
122
153
|
this.logger.info(`Getting root node`);
|
|
123
|
-
|
|
154
|
+
const { rootNodeUid } = await this.sharingPublic.shares.getOwnVolumeIDs();
|
|
155
|
+
return convertInternalNodePromise(this.sharingPublic.nodes.access.getNode(rootNodeUid));
|
|
124
156
|
}
|
|
125
157
|
|
|
126
158
|
/**
|
|
@@ -128,8 +160,60 @@ export class ProtonDrivePublicLinkClient {
|
|
|
128
160
|
*
|
|
129
161
|
* See `ProtonDriveClient.iterateFolderChildren` for more information.
|
|
130
162
|
*/
|
|
131
|
-
async *iterateFolderChildren(
|
|
163
|
+
async *iterateFolderChildren(
|
|
164
|
+
parentUid: NodeOrUid,
|
|
165
|
+
filterOptions?: { type?: NodeType },
|
|
166
|
+
signal?: AbortSignal,
|
|
167
|
+
): AsyncGenerator<MaybeNode> {
|
|
132
168
|
this.logger.info(`Iterating children of ${getUid(parentUid)}`);
|
|
133
|
-
yield
|
|
169
|
+
yield* convertInternalNodeIterator(
|
|
170
|
+
this.sharingPublic.nodes.access.iterateFolderChildren(getUid(parentUid), filterOptions, signal),
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Iterates the nodes by their UIDs.
|
|
176
|
+
*
|
|
177
|
+
* See `ProtonDriveClient.iterateNodes` for more information.
|
|
178
|
+
*/
|
|
179
|
+
async *iterateNodes(nodeUids: NodeOrUid[], signal?: AbortSignal): AsyncGenerator<MaybeMissingNode> {
|
|
180
|
+
this.logger.info(`Iterating ${nodeUids.length} nodes`);
|
|
181
|
+
yield* convertInternalMissingNodeIterator(
|
|
182
|
+
this.sharingPublic.nodes.access.iterateNodes(getUids(nodeUids), signal),
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Get the node by its UID.
|
|
188
|
+
*
|
|
189
|
+
* See `ProtonDriveClient.getNode` for more information.
|
|
190
|
+
*/
|
|
191
|
+
async getNode(nodeUid: NodeOrUid): Promise<MaybeNode> {
|
|
192
|
+
this.logger.info(`Getting node ${getUid(nodeUid)}`);
|
|
193
|
+
return convertInternalNodePromise(this.sharingPublic.nodes.access.getNode(getUid(nodeUid)));
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Get the file downloader to download the node content.
|
|
198
|
+
*
|
|
199
|
+
* See `ProtonDriveClient.getFileDownloader` for more information.
|
|
200
|
+
*/
|
|
201
|
+
async getFileDownloader(nodeUid: NodeOrUid, signal?: AbortSignal): Promise<FileDownloader> {
|
|
202
|
+
this.logger.info(`Getting file downloader for ${getUid(nodeUid)}`);
|
|
203
|
+
return this.download.getFileDownloader(getUid(nodeUid), signal);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Iterates the thumbnails of the given nodes.
|
|
208
|
+
*
|
|
209
|
+
* See `ProtonDriveClient.iterateThumbnails` for more information.
|
|
210
|
+
*/
|
|
211
|
+
async *iterateThumbnails(
|
|
212
|
+
nodeUids: NodeOrUid[],
|
|
213
|
+
thumbnailType?: ThumbnailType,
|
|
214
|
+
signal?: AbortSignal,
|
|
215
|
+
): AsyncGenerator<ThumbnailResult> {
|
|
216
|
+
this.logger.info(`Iterating ${nodeUids.length} thumbnails`);
|
|
217
|
+
yield* this.download.iterateThumbnails(getUids(nodeUids), thumbnailType, signal);
|
|
134
218
|
}
|
|
135
219
|
}
|
package/src/tests/telemetry.ts
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import { ProtonDriveTelemetry } from '../interface';
|
|
1
|
+
import { Logger, ProtonDriveTelemetry } from '../interface';
|
|
2
2
|
import { getMockLogger } from './logger';
|
|
3
3
|
|
|
4
|
-
export function getMockTelemetry(): ProtonDriveTelemetry {
|
|
4
|
+
export function getMockTelemetry(): ProtonDriveTelemetry & { mockLogger: Logger } {
|
|
5
|
+
const mockLogger = getMockLogger();
|
|
6
|
+
|
|
5
7
|
return {
|
|
6
|
-
|
|
8
|
+
mockLogger,
|
|
9
|
+
getLogger: () => mockLogger,
|
|
7
10
|
recordMetric: jest.fn(),
|
|
8
11
|
};
|
|
9
12
|
}
|
package/src/transformers.ts
CHANGED
|
@@ -121,6 +121,14 @@ export function convertInternalNode(node: InternalPartialNode): PublicMaybeNode
|
|
|
121
121
|
} as PublicNodeEntity);
|
|
122
122
|
}
|
|
123
123
|
|
|
124
|
+
export async function* convertInternalRevisionIterator(
|
|
125
|
+
revisionIterator: AsyncGenerator<InternalRevision>,
|
|
126
|
+
): AsyncGenerator<PublicRevision> {
|
|
127
|
+
for await (const revision of revisionIterator) {
|
|
128
|
+
yield convertInternalRevision(revision);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
124
132
|
function convertInternalRevision(revision: InternalRevision): PublicRevision {
|
|
125
133
|
return {
|
|
126
134
|
uid: revision.uid,
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sdkDiagnosticFull.js","sourceRoot":"","sources":["../../src/diagnostic/sdkDiagnosticFull.ts"],"names":[],"mappings":";;;AAIA,mDAAgD;AAEhD;;;GAGG;AACH,MAAa,iBAAiB;IAEd;IACA;IACA;IAHZ,YACY,UAAsB,EACtB,SAA8B,EAC9B,UAAgC;QAFhC,eAAU,GAAV,UAAU,CAAY;QACtB,cAAS,GAAT,SAAS,CAAqB;QAC9B,eAAU,GAAV,UAAU,CAAsB;QAExC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,CAAC,aAAa,CAAC,OAA2B;QAC5C,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,CAAC,cAAc,CAAC,IAAe,EAAE,OAA2B;QAC9D,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3E,CAAC;IAEO,KAAK,CAAC,CAAC,WAAW,CAAC,SAA2C;QAClE,KAAK,CAAC,CAAC,IAAA,6BAAa,EAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,EAAE,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;IACzF,CAAC;IAEO,KAAK,CAAC,CAAC,iBAAiB;QAC5B,KAAK,CAAC,CAAC,IAAA,6BAAa,EAAC,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1F,CAAC;CACJ;AA1BD,8CA0BC"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { PrivateKey } from '../../crypto';
|
|
2
|
-
import { ProtonDriveCryptoCache, Logger } from '../../interface';
|
|
3
|
-
import { DecryptedNodeKeys } from './interface';
|
|
4
|
-
/**
|
|
5
|
-
* Provides caching for public link crypto material.
|
|
6
|
-
*
|
|
7
|
-
* The cache is responsible for serialising and deserialising public link
|
|
8
|
-
* crypto material.
|
|
9
|
-
*/
|
|
10
|
-
export declare class SharingPublicCryptoCache {
|
|
11
|
-
private logger;
|
|
12
|
-
private driveCache;
|
|
13
|
-
constructor(logger: Logger, driveCache: ProtonDriveCryptoCache);
|
|
14
|
-
setShareKey(shareKey: PrivateKey): Promise<void>;
|
|
15
|
-
getShareKey(): Promise<PrivateKey>;
|
|
16
|
-
setNodeKeys(nodeUid: string, keys: DecryptedNodeKeys): Promise<void>;
|
|
17
|
-
getNodeKeys(nodeUid: string): Promise<DecryptedNodeKeys>;
|
|
18
|
-
removeNodeKeys(nodeUids: string[]): Promise<void>;
|
|
19
|
-
}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SharingPublicCryptoCache = void 0;
|
|
4
|
-
/**
|
|
5
|
-
* Provides caching for public link crypto material.
|
|
6
|
-
*
|
|
7
|
-
* The cache is responsible for serialising and deserialising public link
|
|
8
|
-
* crypto material.
|
|
9
|
-
*/
|
|
10
|
-
class SharingPublicCryptoCache {
|
|
11
|
-
logger;
|
|
12
|
-
driveCache;
|
|
13
|
-
constructor(logger, driveCache) {
|
|
14
|
-
this.logger = logger;
|
|
15
|
-
this.driveCache = driveCache;
|
|
16
|
-
this.logger = logger;
|
|
17
|
-
this.driveCache = driveCache;
|
|
18
|
-
}
|
|
19
|
-
async setShareKey(shareKey) {
|
|
20
|
-
await this.driveCache.setEntity(getShareKeyCacheKey(), {
|
|
21
|
-
publicShareKey: {
|
|
22
|
-
key: shareKey,
|
|
23
|
-
},
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
async getShareKey() {
|
|
27
|
-
const shareKeyData = await this.driveCache.getEntity(getShareKeyCacheKey());
|
|
28
|
-
if (!shareKeyData.publicShareKey) {
|
|
29
|
-
try {
|
|
30
|
-
await this.driveCache.removeEntities([getShareKeyCacheKey()]);
|
|
31
|
-
}
|
|
32
|
-
catch (removingError) {
|
|
33
|
-
this.logger.warn(`Failed to remove corrupted public share key from the cache: ${removingError instanceof Error ? removingError.message : removingError}`);
|
|
34
|
-
}
|
|
35
|
-
throw new Error('Failed to deserialize public share key');
|
|
36
|
-
}
|
|
37
|
-
return shareKeyData.publicShareKey.key;
|
|
38
|
-
}
|
|
39
|
-
async setNodeKeys(nodeUid, keys) {
|
|
40
|
-
const cacheUid = getNodeCacheKey(nodeUid);
|
|
41
|
-
await this.driveCache.setEntity(cacheUid, {
|
|
42
|
-
nodeKeys: keys,
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
async getNodeKeys(nodeUid) {
|
|
46
|
-
const nodeKeysData = await this.driveCache.getEntity(getNodeCacheKey(nodeUid));
|
|
47
|
-
if (!nodeKeysData.nodeKeys) {
|
|
48
|
-
try {
|
|
49
|
-
await this.removeNodeKeys([nodeUid]);
|
|
50
|
-
}
|
|
51
|
-
catch (removingError) {
|
|
52
|
-
// The node keys will not be returned, thus SDK will re-fetch
|
|
53
|
-
// and re-cache it. Setting it again should then fix the problem.
|
|
54
|
-
this.logger.warn(`Failed to remove corrupted public node keys from the cache: ${removingError instanceof Error ? removingError.message : removingError}`);
|
|
55
|
-
}
|
|
56
|
-
throw new Error(`Failed to deserialize public node keys`);
|
|
57
|
-
}
|
|
58
|
-
return nodeKeysData.nodeKeys;
|
|
59
|
-
}
|
|
60
|
-
async removeNodeKeys(nodeUids) {
|
|
61
|
-
const cacheUids = nodeUids.map(getNodeCacheKey);
|
|
62
|
-
await this.driveCache.removeEntities(cacheUids);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
exports.SharingPublicCryptoCache = SharingPublicCryptoCache;
|
|
66
|
-
function getShareKeyCacheKey() {
|
|
67
|
-
return 'publicShareKey';
|
|
68
|
-
}
|
|
69
|
-
function getNodeCacheKey(nodeUid) {
|
|
70
|
-
return `publicNodeKeys-${nodeUid}`;
|
|
71
|
-
}
|
|
72
|
-
//# sourceMappingURL=cryptoCache.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cryptoCache.js","sourceRoot":"","sources":["../../../src/internal/sharingPublic/cryptoCache.ts"],"names":[],"mappings":";;;AAIA;;;;;GAKG;AACH,MAAa,wBAAwB;IAErB;IACA;IAFZ,YACY,MAAc,EACd,UAAkC;QADlC,WAAM,GAAN,MAAM,CAAQ;QACd,eAAU,GAAV,UAAU,CAAwB;QAE1C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,QAAoB;QAClC,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,mBAAmB,EAAE,EAAE;YACnD,cAAc,EAAE;gBACZ,GAAG,EAAE,QAAQ;aAChB;SACJ,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,WAAW;QACb,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,mBAAmB,EAAE,CAAC,CAAC;QAC5E,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACD,MAAM,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC;YAClE,CAAC;YAAC,OAAO,aAAsB,EAAE,CAAC;gBAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CACZ,+DAA+D,aAAa,YAAY,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,EAAE,CAC1I,CAAC;YACN,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,YAAY,CAAC,cAAc,CAAC,GAAG,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAe,EAAE,IAAuB;QACtD,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,QAAQ,EAAE;YACtC,QAAQ,EAAE,IAAI;SACjB,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAe;QAC7B,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/E,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;YACzB,IAAI,CAAC;gBACD,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YACzC,CAAC;YAAC,OAAO,aAAsB,EAAE,CAAC;gBAC9B,6DAA6D;gBAC7D,iEAAiE;gBACjE,IAAI,CAAC,MAAM,CAAC,IAAI,CACZ,+DAA+D,aAAa,YAAY,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,EAAE,CAC1I,CAAC;YACN,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,YAAY,CAAC,QAAQ,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,QAAkB;QACnC,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAChD,MAAM,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACJ;AA5DD,4DA4DC;AAED,SAAS,mBAAmB;IACxB,OAAO,gBAAgB,CAAC;AAC5B,CAAC;AAED,SAAS,eAAe,CAAC,OAAe;IACpC,OAAO,kBAAkB,OAAO,EAAE,CAAC;AACvC,CAAC"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { DriveCrypto, PrivateKey } from '../../crypto';
|
|
2
|
-
import { ProtonDriveTelemetry, ProtonDriveAccount } from '../../interface';
|
|
3
|
-
import { NodesCryptoService } from '../nodes/cryptoService';
|
|
4
|
-
import { EncryptedShareCrypto } from './interface';
|
|
5
|
-
export declare class SharingPublicCryptoService extends NodesCryptoService {
|
|
6
|
-
private password;
|
|
7
|
-
constructor(telemetry: ProtonDriveTelemetry, driveCrypto: DriveCrypto, account: ProtonDriveAccount, password: string);
|
|
8
|
-
decryptPublicLinkShareKey(encryptedShare: EncryptedShareCrypto): Promise<PrivateKey>;
|
|
9
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cryptoService.js","sourceRoot":"","sources":["../../../src/internal/sharingPublic/cryptoService.ts"],"names":[],"mappings":";;;AAAA,+BAAyB;AAEzB,yCAA4E;AAC5E,sCAAmD;AACnD,+CAWyB;AACzB,0DAA4D;AAG5D,MAAa,0BAA2B,SAAQ,kCAAkB;IAKlD;IAJZ,YACI,SAA+B,EAC/B,WAAwB,EACxB,OAA2B,EACnB,QAAgB;QAExB,KAAK,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,2BAA2B,CAAC,SAAS,CAAC,CAAC,CAAC;QAF3E,aAAQ,GAAR,QAAQ,CAAQ;QAGxB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,yBAAyB,CAAC,cAAoC;QAChE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,yBAAyB,CACtE,IAAI,CAAC,QAAQ,EACb,cAAc,CAAC,qBAAqB,EACpC,cAAc,CAAC,UAAU,EACzB,cAAc,CAAC,iBAAiB,CACnC,CAAC;QACF,OAAO,QAAQ,CAAC;IACpB,CAAC;CACJ;AApBD,gEAoBC;AAED,MAAM,2BAA2B;IACrB,MAAM,CAAS;IACf,SAAS,CAAuB;IAExC,YAAY,SAA+B;QACvC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,mBAAmB,CACrB,IAAyC,EACzC,KAAmC,EACnC,aAAqB,EACrB,QAA6B,EAC7B,kBAA4B,EAC5B,aAAsB,EACtB,4BAA4B,GAAG,KAAK;QAEpC,IAAI,QAAQ,KAAK,4BAAmB,CAAC,gBAAgB,EAAE,CAAC;YACpD,OAAO,IAAA,oBAAQ,EAAC,aAAa,IAAK,IAAsB,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO,IAAA,uBAAW,EAAC;YACf,aAAa;YACb,KAAK,EAAE,CAAC,aAAa;gBACjB,CAAC,CAAC,IAAA,QAAC,EAAC,MAAM,CAAC,CAAC,CAAC,CAAA,uCAAuC;gBACpD,CAAC,CAAC,IAAA,+BAAsB,EAAC,QAAQ,EAAE,kBAAkB,EAAE,aAAa,EAAE,4BAA4B,CAAC;SAC1G,CAAC,CAAC;IACP,CAAC;IAED,qBAAqB,CACjB,IAAyC,EACzC,KAAkC,EAClC,KAAc;QAEd,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;QAElE,IAAI,CAAC,MAAM,CAAC,KAAK,CACb,sCAAsC,IAAI,CAAC,GAAG,uBAAuB,cAAc,GAAG,EACtF,KAAK,CACR,CAAC;QAEF,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;YACxB,SAAS,EAAE,iBAAiB;YAC5B,UAAU,EAAE,4BAAgB,CAAC,YAAY;YACzC,KAAK;YACL,cAAc;YACd,KAAK;YACL,GAAG,EAAE,IAAI,CAAC,GAAG;SAChB,CAAC,CAAC;IACP,CAAC;IAED,uBAAuB;QACnB,0DAA0D;QAC1D,qEAAqE;IACzE,CAAC;CACJ"}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export type { EncryptedNode, EncryptedNodeFolderCrypto, EncryptedNodeFileCrypto, DecryptedNode, DecryptedNodeKeys, } from '../nodes/interface';
|
|
2
|
-
export interface EncryptedShareCrypto {
|
|
3
|
-
base64UrlPasswordSalt: string;
|
|
4
|
-
armoredKey: string;
|
|
5
|
-
armoredPassphrase: string;
|
|
6
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../../../src/internal/sharingPublic/interface.ts"],"names":[],"mappings":""}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { Logger } from '../../interface';
|
|
2
|
-
import { SharingPublicAPIService } from './apiService';
|
|
3
|
-
import { SharingPublicCryptoCache } from './cryptoCache';
|
|
4
|
-
import { SharingPublicCryptoService } from './cryptoService';
|
|
5
|
-
import { DecryptedNode, DecryptedNodeKeys } from './interface';
|
|
6
|
-
export declare class SharingPublicManager {
|
|
7
|
-
private logger;
|
|
8
|
-
private api;
|
|
9
|
-
private cryptoCache;
|
|
10
|
-
private cryptoService;
|
|
11
|
-
private token;
|
|
12
|
-
constructor(logger: Logger, api: SharingPublicAPIService, cryptoCache: SharingPublicCryptoCache, cryptoService: SharingPublicCryptoService, token: string);
|
|
13
|
-
getRootNode(): Promise<DecryptedNode>;
|
|
14
|
-
iterateFolderChildren(parentUid: string, signal?: AbortSignal): AsyncGenerator<DecryptedNode>;
|
|
15
|
-
private decryptShare;
|
|
16
|
-
private decryptNode;
|
|
17
|
-
private getParentKey;
|
|
18
|
-
getNodeKeys(nodeUid: string): Promise<DecryptedNodeKeys>;
|
|
19
|
-
}
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SharingPublicManager = void 0;
|
|
4
|
-
const nodesAccess_1 = require("../nodes/nodesAccess");
|
|
5
|
-
// TODO: comment
|
|
6
|
-
class SharingPublicManager {
|
|
7
|
-
logger;
|
|
8
|
-
api;
|
|
9
|
-
cryptoCache;
|
|
10
|
-
cryptoService;
|
|
11
|
-
token;
|
|
12
|
-
constructor(logger, api, cryptoCache, cryptoService, token) {
|
|
13
|
-
this.logger = logger;
|
|
14
|
-
this.api = api;
|
|
15
|
-
this.cryptoCache = cryptoCache;
|
|
16
|
-
this.cryptoService = cryptoService;
|
|
17
|
-
this.token = token;
|
|
18
|
-
this.logger = logger;
|
|
19
|
-
this.api = api;
|
|
20
|
-
this.cryptoCache = cryptoCache;
|
|
21
|
-
this.cryptoService = cryptoService;
|
|
22
|
-
this.token = token;
|
|
23
|
-
}
|
|
24
|
-
async getRootNode() {
|
|
25
|
-
const { encryptedNode, encryptedShare } = await this.api.getPublicLinkRoot(this.token);
|
|
26
|
-
await this.decryptShare(encryptedShare);
|
|
27
|
-
return this.decryptNode(encryptedNode);
|
|
28
|
-
}
|
|
29
|
-
async *iterateFolderChildren(parentUid, signal) {
|
|
30
|
-
// TODO: optimise this - decrypt in parallel
|
|
31
|
-
for await (const node of this.api.iterateFolderChildren(parentUid, signal)) {
|
|
32
|
-
const decryptedNode = await this.decryptNode(node);
|
|
33
|
-
yield decryptedNode;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
async decryptShare(encryptedShare) {
|
|
37
|
-
const shareKey = await this.cryptoService.decryptPublicLinkShareKey(encryptedShare);
|
|
38
|
-
await this.cryptoCache.setShareKey(shareKey);
|
|
39
|
-
}
|
|
40
|
-
async decryptNode(encryptedNode) {
|
|
41
|
-
const parentKey = await this.getParentKey(encryptedNode);
|
|
42
|
-
const { node: unparsedNode, keys } = await this.cryptoService.decryptNode(encryptedNode, parentKey);
|
|
43
|
-
const node = await (0, nodesAccess_1.parseNode)(this.logger, unparsedNode);
|
|
44
|
-
// TODO: cache of metadata?
|
|
45
|
-
if (keys) {
|
|
46
|
-
try {
|
|
47
|
-
await this.cryptoCache.setNodeKeys(node.uid, keys);
|
|
48
|
-
}
|
|
49
|
-
catch (error) {
|
|
50
|
-
this.logger.error(`Failed to cache node keys ${node.uid}`, error);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
return node;
|
|
54
|
-
}
|
|
55
|
-
async getParentKey(node) {
|
|
56
|
-
if (node.parentUid) {
|
|
57
|
-
// TODO: try-catch
|
|
58
|
-
const keys = await this.getNodeKeys(node.parentUid);
|
|
59
|
-
return keys.key;
|
|
60
|
-
}
|
|
61
|
-
try {
|
|
62
|
-
return await this.cryptoCache.getShareKey();
|
|
63
|
-
}
|
|
64
|
-
catch {
|
|
65
|
-
await this.getRootNode();
|
|
66
|
-
return this.cryptoCache.getShareKey();
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
async getNodeKeys(nodeUid) {
|
|
70
|
-
try {
|
|
71
|
-
const keys = await this.cryptoCache.getNodeKeys(nodeUid);
|
|
72
|
-
return keys;
|
|
73
|
-
}
|
|
74
|
-
catch {
|
|
75
|
-
// TODO: handle this
|
|
76
|
-
throw new Error('Node key not found in cache');
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
exports.SharingPublicManager = SharingPublicManager;
|
|
81
|
-
//# sourceMappingURL=manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/internal/sharingPublic/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import { PrivateKey } from '../../crypto';
|
|
2
|
-
import { ProtonDriveCryptoCache, Logger } from '../../interface';
|
|
3
|
-
import { DecryptedNodeKeys } from './interface';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Provides caching for public link crypto material.
|
|
7
|
-
*
|
|
8
|
-
* The cache is responsible for serialising and deserialising public link
|
|
9
|
-
* crypto material.
|
|
10
|
-
*/
|
|
11
|
-
export class SharingPublicCryptoCache {
|
|
12
|
-
constructor(
|
|
13
|
-
private logger: Logger,
|
|
14
|
-
private driveCache: ProtonDriveCryptoCache,
|
|
15
|
-
) {
|
|
16
|
-
this.logger = logger;
|
|
17
|
-
this.driveCache = driveCache;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
async setShareKey(shareKey: PrivateKey): Promise<void> {
|
|
21
|
-
await this.driveCache.setEntity(getShareKeyCacheKey(), {
|
|
22
|
-
publicShareKey: {
|
|
23
|
-
key: shareKey,
|
|
24
|
-
},
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
async getShareKey(): Promise<PrivateKey> {
|
|
29
|
-
const shareKeyData = await this.driveCache.getEntity(getShareKeyCacheKey());
|
|
30
|
-
if (!shareKeyData.publicShareKey) {
|
|
31
|
-
try {
|
|
32
|
-
await this.driveCache.removeEntities([getShareKeyCacheKey()]);
|
|
33
|
-
} catch (removingError: unknown) {
|
|
34
|
-
this.logger.warn(
|
|
35
|
-
`Failed to remove corrupted public share key from the cache: ${removingError instanceof Error ? removingError.message : removingError}`,
|
|
36
|
-
);
|
|
37
|
-
}
|
|
38
|
-
throw new Error('Failed to deserialize public share key');
|
|
39
|
-
}
|
|
40
|
-
return shareKeyData.publicShareKey.key;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
async setNodeKeys(nodeUid: string, keys: DecryptedNodeKeys): Promise<void> {
|
|
44
|
-
const cacheUid = getNodeCacheKey(nodeUid);
|
|
45
|
-
await this.driveCache.setEntity(cacheUid, {
|
|
46
|
-
nodeKeys: keys,
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
async getNodeKeys(nodeUid: string): Promise<DecryptedNodeKeys> {
|
|
51
|
-
const nodeKeysData = await this.driveCache.getEntity(getNodeCacheKey(nodeUid));
|
|
52
|
-
if (!nodeKeysData.nodeKeys) {
|
|
53
|
-
try {
|
|
54
|
-
await this.removeNodeKeys([nodeUid]);
|
|
55
|
-
} catch (removingError: unknown) {
|
|
56
|
-
// The node keys will not be returned, thus SDK will re-fetch
|
|
57
|
-
// and re-cache it. Setting it again should then fix the problem.
|
|
58
|
-
this.logger.warn(
|
|
59
|
-
`Failed to remove corrupted public node keys from the cache: ${removingError instanceof Error ? removingError.message : removingError}`,
|
|
60
|
-
);
|
|
61
|
-
}
|
|
62
|
-
throw new Error(`Failed to deserialize public node keys`);
|
|
63
|
-
}
|
|
64
|
-
return nodeKeysData.nodeKeys;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
async removeNodeKeys(nodeUids: string[]): Promise<void> {
|
|
68
|
-
const cacheUids = nodeUids.map(getNodeCacheKey);
|
|
69
|
-
await this.driveCache.removeEntities(cacheUids);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
function getShareKeyCacheKey() {
|
|
74
|
-
return 'publicShareKey';
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
function getNodeCacheKey(nodeUid: string) {
|
|
78
|
-
return `publicNodeKeys-${nodeUid}`;
|
|
79
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
// TODO: use them directly, or avoid them completely
|
|
2
|
-
export type {
|
|
3
|
-
EncryptedNode,
|
|
4
|
-
EncryptedNodeFolderCrypto,
|
|
5
|
-
EncryptedNodeFileCrypto,
|
|
6
|
-
DecryptedNode,
|
|
7
|
-
DecryptedNodeKeys,
|
|
8
|
-
} from '../nodes/interface';
|
|
9
|
-
|
|
10
|
-
export interface EncryptedShareCrypto {
|
|
11
|
-
base64UrlPasswordSalt: string;
|
|
12
|
-
armoredKey: string;
|
|
13
|
-
armoredPassphrase: string;
|
|
14
|
-
}
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import { PrivateKey } from '../../crypto';
|
|
2
|
-
import { Logger } from '../../interface';
|
|
3
|
-
import { parseNode } from '../nodes/nodesAccess';
|
|
4
|
-
import { SharingPublicAPIService } from './apiService';
|
|
5
|
-
import { SharingPublicCryptoCache } from './cryptoCache';
|
|
6
|
-
import { SharingPublicCryptoService } from './cryptoService';
|
|
7
|
-
import { EncryptedShareCrypto, EncryptedNode, DecryptedNode, DecryptedNodeKeys } from './interface';
|
|
8
|
-
|
|
9
|
-
// TODO: comment
|
|
10
|
-
export class SharingPublicManager {
|
|
11
|
-
constructor(
|
|
12
|
-
private logger: Logger,
|
|
13
|
-
private api: SharingPublicAPIService,
|
|
14
|
-
private cryptoCache: SharingPublicCryptoCache,
|
|
15
|
-
private cryptoService: SharingPublicCryptoService,
|
|
16
|
-
private token: string,
|
|
17
|
-
) {
|
|
18
|
-
this.logger = logger;
|
|
19
|
-
this.api = api;
|
|
20
|
-
this.cryptoCache = cryptoCache;
|
|
21
|
-
this.cryptoService = cryptoService;
|
|
22
|
-
this.token = token;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
async getRootNode(): Promise<DecryptedNode> {
|
|
26
|
-
const { encryptedNode, encryptedShare } = await this.api.getPublicLinkRoot(this.token);
|
|
27
|
-
await this.decryptShare(encryptedShare);
|
|
28
|
-
return this.decryptNode(encryptedNode);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
async *iterateFolderChildren(parentUid: string, signal?: AbortSignal): AsyncGenerator<DecryptedNode> {
|
|
32
|
-
// TODO: optimise this - decrypt in parallel
|
|
33
|
-
for await (const node of this.api.iterateFolderChildren(parentUid, signal)) {
|
|
34
|
-
const decryptedNode = await this.decryptNode(node);
|
|
35
|
-
yield decryptedNode;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
private async decryptShare(encryptedShare: EncryptedShareCrypto): Promise<void> {
|
|
40
|
-
const shareKey = await this.cryptoService.decryptPublicLinkShareKey(encryptedShare);
|
|
41
|
-
await this.cryptoCache.setShareKey(shareKey);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
private async decryptNode(encryptedNode: EncryptedNode): Promise<DecryptedNode> {
|
|
45
|
-
const parentKey = await this.getParentKey(encryptedNode);
|
|
46
|
-
|
|
47
|
-
const { node: unparsedNode, keys } = await this.cryptoService.decryptNode(encryptedNode, parentKey);
|
|
48
|
-
const node = await parseNode(this.logger, unparsedNode);
|
|
49
|
-
|
|
50
|
-
// TODO: cache of metadata?
|
|
51
|
-
if (keys) {
|
|
52
|
-
try {
|
|
53
|
-
await this.cryptoCache.setNodeKeys(node.uid, keys);
|
|
54
|
-
} catch (error: unknown) {
|
|
55
|
-
this.logger.error(`Failed to cache node keys ${node.uid}`, error);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
return node;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
private async getParentKey(node: Pick<DecryptedNode, 'parentUid'>): Promise<PrivateKey> {
|
|
63
|
-
if (node.parentUid) {
|
|
64
|
-
// TODO: try-catch
|
|
65
|
-
const keys = await this.getNodeKeys(node.parentUid);
|
|
66
|
-
return keys.key;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
try {
|
|
70
|
-
return await this.cryptoCache.getShareKey();
|
|
71
|
-
} catch {
|
|
72
|
-
await this.getRootNode();
|
|
73
|
-
return this.cryptoCache.getShareKey();
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
async getNodeKeys(nodeUid: string): Promise<DecryptedNodeKeys> {
|
|
78
|
-
try {
|
|
79
|
-
const keys = await this.cryptoCache.getNodeKeys(nodeUid);
|
|
80
|
-
return keys;
|
|
81
|
-
} catch {
|
|
82
|
-
// TODO: handle this
|
|
83
|
-
throw new Error('Node key not found in cache');
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
}
|