@protontech/drive-sdk 0.3.0 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/crypto/driveCrypto.d.ts +1 -1
- package/dist/crypto/driveCrypto.js.map +1 -1
- package/dist/crypto/interface.d.ts +6 -1
- package/dist/crypto/openPGPCrypto.d.ts +1 -1
- package/dist/crypto/openPGPCrypto.js +4 -1
- package/dist/crypto/openPGPCrypto.js.map +1 -1
- package/dist/diagnostic/httpClient.d.ts +3 -3
- package/dist/interface/httpClient.d.ts +5 -5
- package/dist/interface/index.d.ts +15 -5
- package/dist/internal/apiService/apiService.js +1 -1
- package/dist/internal/apiService/apiService.js.map +1 -1
- package/dist/internal/apiService/errorCodes.d.ts +1 -0
- package/dist/internal/apiService/errorCodes.js.map +1 -1
- package/dist/internal/apiService/errors.d.ts +4 -3
- package/dist/internal/apiService/errors.js +7 -4
- package/dist/internal/apiService/errors.js.map +1 -1
- package/dist/internal/apiService/errors.test.js +2 -1
- package/dist/internal/apiService/errors.test.js.map +1 -1
- package/dist/internal/download/cryptoService.js +2 -2
- package/dist/internal/download/cryptoService.js.map +1 -1
- package/dist/internal/download/fileDownloader.js +2 -2
- package/dist/internal/download/fileDownloader.js.map +1 -1
- package/dist/internal/download/fileDownloader.test.js +3 -1
- package/dist/internal/download/fileDownloader.test.js.map +1 -1
- package/dist/internal/events/index.d.ts +1 -1
- package/dist/internal/nodes/cache.js +3 -1
- package/dist/internal/nodes/cache.js.map +1 -1
- package/dist/internal/nodes/cryptoCache.js +6 -7
- package/dist/internal/nodes/cryptoCache.js.map +1 -1
- package/dist/internal/nodes/cryptoCache.test.js +4 -7
- package/dist/internal/nodes/cryptoCache.test.js.map +1 -1
- package/dist/internal/nodes/cryptoReporter.d.ts +20 -0
- package/dist/internal/nodes/cryptoReporter.js +96 -0
- package/dist/internal/nodes/cryptoReporter.js.map +1 -0
- package/dist/internal/nodes/cryptoService.d.ts +17 -12
- package/dist/internal/nodes/cryptoService.js +17 -97
- package/dist/internal/nodes/cryptoService.js.map +1 -1
- package/dist/internal/nodes/cryptoService.test.js +3 -1
- package/dist/internal/nodes/cryptoService.test.js.map +1 -1
- package/dist/internal/nodes/index.js +3 -1
- package/dist/internal/nodes/index.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 +52 -54
- package/dist/internal/nodes/nodesAccess.js.map +1 -1
- package/dist/internal/shares/cryptoCache.d.ts +4 -3
- package/dist/internal/shares/cryptoCache.js +23 -6
- package/dist/internal/shares/cryptoCache.js.map +1 -1
- package/dist/internal/shares/cryptoCache.test.js +3 -2
- package/dist/internal/shares/cryptoCache.test.js.map +1 -1
- package/dist/internal/shares/index.js +1 -1
- package/dist/internal/shares/index.js.map +1 -1
- package/dist/internal/sharing/cache.d.ts +3 -0
- package/dist/internal/sharing/cache.js +17 -2
- package/dist/internal/sharing/cache.js.map +1 -1
- package/dist/internal/sharing/cryptoService.js +8 -6
- package/dist/internal/sharing/cryptoService.js.map +1 -1
- package/dist/internal/sharing/cryptoService.test.js +13 -0
- package/dist/internal/sharing/cryptoService.test.js.map +1 -1
- package/dist/internal/sharing/index.js +1 -1
- package/dist/internal/sharing/index.js.map +1 -1
- package/dist/internal/sharing/interface.d.ts +1 -1
- package/dist/internal/sharing/interface.js +1 -1
- package/dist/internal/sharing/sharingAccess.js +6 -0
- package/dist/internal/sharing/sharingAccess.js.map +1 -1
- package/dist/internal/sharing/sharingAccess.test.js +242 -33
- package/dist/internal/sharing/sharingAccess.test.js.map +1 -1
- package/dist/internal/sharing/sharingManagement.d.ts +3 -1
- package/dist/internal/sharing/sharingManagement.js +10 -1
- package/dist/internal/sharing/sharingManagement.js.map +1 -1
- package/dist/internal/sharing/sharingManagement.test.js +32 -1
- package/dist/internal/sharing/sharingManagement.test.js.map +1 -1
- package/dist/internal/sharingPublic/apiService.d.ts +19 -0
- package/dist/internal/sharingPublic/apiService.js +141 -0
- package/dist/internal/sharingPublic/apiService.js.map +1 -0
- package/dist/internal/sharingPublic/cryptoCache.d.ts +19 -0
- package/dist/internal/sharingPublic/cryptoCache.js +72 -0
- package/dist/internal/sharingPublic/cryptoCache.js.map +1 -0
- package/dist/internal/sharingPublic/cryptoService.d.ts +9 -0
- package/dist/internal/sharingPublic/cryptoService.js +57 -0
- package/dist/internal/sharingPublic/cryptoService.js.map +1 -0
- package/dist/internal/sharingPublic/index.d.ts +15 -0
- package/dist/internal/sharingPublic/index.js +27 -0
- package/dist/internal/sharingPublic/index.js.map +1 -0
- package/dist/internal/sharingPublic/interface.d.ts +6 -0
- package/dist/internal/sharingPublic/interface.js +3 -0
- package/dist/internal/sharingPublic/interface.js.map +1 -0
- package/dist/internal/sharingPublic/manager.d.ts +19 -0
- package/dist/internal/sharingPublic/manager.js +81 -0
- package/dist/internal/sharingPublic/manager.js.map +1 -0
- package/dist/internal/sharingPublic/session/apiService.d.ts +28 -0
- package/dist/internal/sharingPublic/session/apiService.js +55 -0
- package/dist/internal/sharingPublic/session/apiService.js.map +1 -0
- package/dist/internal/sharingPublic/session/httpClient.d.ts +16 -0
- package/dist/internal/sharingPublic/session/httpClient.js +41 -0
- package/dist/internal/sharingPublic/session/httpClient.js.map +1 -0
- package/dist/internal/sharingPublic/session/index.d.ts +1 -0
- package/dist/internal/sharingPublic/session/index.js +6 -0
- package/dist/internal/sharingPublic/session/index.js.map +1 -0
- package/dist/internal/sharingPublic/session/interface.d.ts +18 -0
- package/dist/internal/sharingPublic/session/interface.js +3 -0
- package/dist/internal/sharingPublic/session/interface.js.map +1 -0
- package/dist/internal/sharingPublic/session/manager.d.ts +49 -0
- package/dist/internal/sharingPublic/session/manager.js +75 -0
- package/dist/internal/sharingPublic/session/manager.js.map +1 -0
- package/dist/internal/sharingPublic/session/session.d.ts +34 -0
- package/dist/internal/sharingPublic/session/session.js +67 -0
- package/dist/internal/sharingPublic/session/session.js.map +1 -0
- package/dist/internal/sharingPublic/session/url.d.ts +12 -0
- package/dist/internal/sharingPublic/session/url.js +23 -0
- package/dist/internal/sharingPublic/session/url.js.map +1 -0
- package/dist/internal/sharingPublic/session/url.test.d.ts +1 -0
- package/dist/internal/sharingPublic/session/url.test.js +59 -0
- package/dist/internal/sharingPublic/session/url.test.js.map +1 -0
- package/dist/internal/upload/streamUploader.js +1 -1
- package/dist/internal/upload/streamUploader.js.map +1 -1
- package/dist/internal/upload/streamUploader.test.js +3 -1
- package/dist/internal/upload/streamUploader.test.js.map +1 -1
- package/dist/protonDriveClient.d.ts +18 -3
- package/dist/protonDriveClient.js +31 -8
- package/dist/protonDriveClient.js.map +1 -1
- package/dist/protonDrivePublicLinkClient.d.ts +57 -0
- package/dist/protonDrivePublicLinkClient.js +73 -0
- package/dist/protonDrivePublicLinkClient.js.map +1 -0
- package/package.json +1 -1
- package/src/crypto/driveCrypto.ts +1 -1
- package/src/crypto/interface.ts +12 -1
- package/src/crypto/openPGPCrypto.ts +5 -2
- package/src/diagnostic/httpClient.ts +4 -4
- package/src/interface/httpClient.ts +5 -5
- package/src/interface/index.ts +18 -6
- package/src/internal/apiService/apiService.ts +1 -1
- package/src/internal/apiService/errorCodes.ts +1 -0
- package/src/internal/apiService/errors.test.ts +2 -1
- package/src/internal/apiService/errors.ts +15 -4
- package/src/internal/download/cryptoService.ts +2 -2
- package/src/internal/download/fileDownloader.test.ts +3 -1
- package/src/internal/download/fileDownloader.ts +2 -2
- package/src/internal/events/index.ts +1 -1
- package/src/internal/nodes/cache.ts +3 -1
- package/src/internal/nodes/cryptoCache.test.ts +4 -7
- package/src/internal/nodes/cryptoCache.ts +6 -7
- package/src/internal/nodes/cryptoReporter.ts +145 -0
- package/src/internal/nodes/cryptoService.test.ts +3 -1
- package/src/internal/nodes/cryptoService.ts +44 -137
- package/src/internal/nodes/index.ts +3 -1
- package/src/internal/nodes/interface.ts +3 -1
- package/src/internal/nodes/nodesAccess.ts +59 -61
- package/src/internal/shares/cryptoCache.test.ts +3 -2
- package/src/internal/shares/cryptoCache.ts +26 -7
- package/src/internal/shares/index.ts +1 -1
- package/src/internal/sharing/cache.ts +19 -2
- package/src/internal/sharing/cryptoService.test.ts +22 -1
- package/src/internal/sharing/cryptoService.ts +8 -6
- package/src/internal/sharing/index.ts +1 -0
- package/src/internal/sharing/interface.ts +1 -1
- package/src/internal/sharing/sharingAccess.test.ts +282 -34
- package/src/internal/sharing/sharingAccess.ts +6 -0
- package/src/internal/sharing/sharingManagement.test.ts +33 -0
- package/src/internal/sharing/sharingManagement.ts +9 -0
- package/src/internal/sharingPublic/apiService.ts +173 -0
- package/src/internal/sharingPublic/cryptoCache.ts +79 -0
- package/src/internal/sharingPublic/cryptoService.ts +98 -0
- package/src/internal/sharingPublic/index.ts +41 -0
- package/src/internal/sharingPublic/interface.ts +14 -0
- package/src/internal/sharingPublic/manager.ts +86 -0
- package/src/internal/sharingPublic/session/apiService.ts +74 -0
- package/src/internal/sharingPublic/session/httpClient.ts +48 -0
- package/src/internal/sharingPublic/session/index.ts +1 -0
- package/src/internal/sharingPublic/session/interface.ts +20 -0
- package/src/internal/sharingPublic/session/manager.ts +97 -0
- package/src/internal/sharingPublic/session/session.ts +78 -0
- package/src/internal/sharingPublic/session/url.test.ts +72 -0
- package/src/internal/sharingPublic/session/url.ts +23 -0
- package/src/internal/upload/streamUploader.test.ts +3 -1
- package/src/internal/upload/streamUploader.ts +1 -1
- package/src/protonDriveClient.ts +48 -11
- package/src/protonDrivePublicLinkClient.ts +135 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SharingPublicCryptoService = void 0;
|
|
4
|
+
const ttag_1 = require("ttag");
|
|
5
|
+
const crypto_1 = require("../../crypto");
|
|
6
|
+
const errors_1 = require("../errors");
|
|
7
|
+
const interface_1 = require("../../interface");
|
|
8
|
+
const cryptoService_1 = require("../nodes/cryptoService");
|
|
9
|
+
class SharingPublicCryptoService extends cryptoService_1.NodesCryptoService {
|
|
10
|
+
password;
|
|
11
|
+
constructor(telemetry, driveCrypto, account, password) {
|
|
12
|
+
super(telemetry, driveCrypto, account, new SharingPublicCryptoReporter(telemetry));
|
|
13
|
+
this.password = password;
|
|
14
|
+
this.password = password;
|
|
15
|
+
}
|
|
16
|
+
async decryptPublicLinkShareKey(encryptedShare) {
|
|
17
|
+
const { key: shareKey } = await this.driveCrypto.decryptKeyWithSrpPassword(this.password, encryptedShare.base64UrlPasswordSalt, encryptedShare.armoredKey, encryptedShare.armoredPassphrase);
|
|
18
|
+
return shareKey;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.SharingPublicCryptoService = SharingPublicCryptoService;
|
|
22
|
+
class SharingPublicCryptoReporter {
|
|
23
|
+
logger;
|
|
24
|
+
telemetry;
|
|
25
|
+
constructor(telemetry) {
|
|
26
|
+
this.telemetry = telemetry;
|
|
27
|
+
this.logger = telemetry.getLogger('sharingPublic-crypto');
|
|
28
|
+
}
|
|
29
|
+
async handleClaimedAuthor(node, field, signatureType, verified, verificationErrors, claimedAuthor, notAvailableVerificationKeys = false) {
|
|
30
|
+
if (verified === crypto_1.VERIFICATION_STATUS.SIGNED_AND_VALID) {
|
|
31
|
+
return (0, interface_1.resultOk)(claimedAuthor || null);
|
|
32
|
+
}
|
|
33
|
+
return (0, interface_1.resultError)({
|
|
34
|
+
claimedAuthor,
|
|
35
|
+
error: !claimedAuthor
|
|
36
|
+
? (0, ttag_1.c)('Info').t `Author is not provided on public link`
|
|
37
|
+
: (0, errors_1.getVerificationMessage)(verified, verificationErrors, signatureType, notAvailableVerificationKeys),
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
reportDecryptionError(node, field, error) {
|
|
41
|
+
const fromBefore2024 = node.creationTime < new Date('2024-01-01');
|
|
42
|
+
this.logger.error(`Failed to decrypt public link node ${node.uid} (from before 2024: ${fromBefore2024})`, error);
|
|
43
|
+
this.telemetry.recordMetric({
|
|
44
|
+
eventName: 'decryptionError',
|
|
45
|
+
volumeType: interface_1.MetricVolumeType.SharedPublic,
|
|
46
|
+
field,
|
|
47
|
+
fromBefore2024,
|
|
48
|
+
error,
|
|
49
|
+
uid: node.uid,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
reportVerificationError() {
|
|
53
|
+
// Authors or signatures are not provided on public links.
|
|
54
|
+
// We do not report any signature verification errors at this moment.
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=cryptoService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { DriveCrypto } from '../../crypto';
|
|
2
|
+
import { ProtonDriveCryptoCache, ProtonDriveTelemetry, ProtonDriveAccount } from '../../interface';
|
|
3
|
+
import { DriveAPIService } from '../apiService';
|
|
4
|
+
import { SharingPublicManager } from './manager';
|
|
5
|
+
export { SharingPublicSessionManager } from './session/manager';
|
|
6
|
+
/**
|
|
7
|
+
* Provides facade for the whole sharing public module.
|
|
8
|
+
*
|
|
9
|
+
* The sharing public module is responsible for handling public link data, including
|
|
10
|
+
* API communication, encryption, decryption, and caching.
|
|
11
|
+
*
|
|
12
|
+
* This facade provides internal interface that other modules can use to
|
|
13
|
+
* interact with the public links.
|
|
14
|
+
*/
|
|
15
|
+
export declare function initSharingPublicModule(telemetry: ProtonDriveTelemetry, apiService: DriveAPIService, driveCryptoCache: ProtonDriveCryptoCache, driveCrypto: DriveCrypto, account: ProtonDriveAccount, token: string, password: string): SharingPublicManager;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SharingPublicSessionManager = void 0;
|
|
4
|
+
exports.initSharingPublicModule = initSharingPublicModule;
|
|
5
|
+
const apiService_1 = require("./apiService");
|
|
6
|
+
const cryptoCache_1 = require("./cryptoCache");
|
|
7
|
+
const cryptoService_1 = require("./cryptoService");
|
|
8
|
+
const manager_1 = require("./manager");
|
|
9
|
+
var manager_2 = require("./session/manager");
|
|
10
|
+
Object.defineProperty(exports, "SharingPublicSessionManager", { enumerable: true, get: function () { return manager_2.SharingPublicSessionManager; } });
|
|
11
|
+
/**
|
|
12
|
+
* Provides facade for the whole sharing public module.
|
|
13
|
+
*
|
|
14
|
+
* The sharing public module is responsible for handling public link data, including
|
|
15
|
+
* API communication, encryption, decryption, and caching.
|
|
16
|
+
*
|
|
17
|
+
* This facade provides internal interface that other modules can use to
|
|
18
|
+
* interact with the public links.
|
|
19
|
+
*/
|
|
20
|
+
function initSharingPublicModule(telemetry, apiService, driveCryptoCache, driveCrypto, account, token, password) {
|
|
21
|
+
const api = new apiService_1.SharingPublicAPIService(telemetry.getLogger('sharingPublic-api'), apiService);
|
|
22
|
+
const cryptoCache = new cryptoCache_1.SharingPublicCryptoCache(telemetry.getLogger('sharingPublic-crypto'), driveCryptoCache);
|
|
23
|
+
const cryptoService = new cryptoService_1.SharingPublicCryptoService(telemetry, driveCrypto, account, password);
|
|
24
|
+
const manager = new manager_1.SharingPublicManager(telemetry.getLogger('sharingPublic-nodes'), api, cryptoCache, cryptoService, token);
|
|
25
|
+
return manager;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/internal/sharingPublic/index.ts"],"names":[],"mappings":";;;AAmBA,0DAqBC;AArCD,6CAAuD;AACvD,+CAAyD;AACzD,mDAA6D;AAC7D,uCAAiD;AAEjD,6CAAgE;AAAvD,sHAAA,2BAA2B,OAAA;AAEpC;;;;;;;;GAQG;AACH,SAAgB,uBAAuB,CACnC,SAA+B,EAC/B,UAA2B,EAC3B,gBAAwC,EACxC,WAAwB,EACxB,OAA2B,EAC3B,KAAa,EACb,QAAgB;IAEhB,MAAM,GAAG,GAAG,IAAI,oCAAuB,CAAC,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,EAAE,UAAU,CAAC,CAAC;IAC9F,MAAM,WAAW,GAAG,IAAI,sCAAwB,CAAC,SAAS,CAAC,SAAS,CAAC,sBAAsB,CAAC,EAAE,gBAAgB,CAAC,CAAC;IAChH,MAAM,aAAa,GAAG,IAAI,0CAA0B,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAChG,MAAM,OAAO,GAAG,IAAI,8BAAoB,CACpC,SAAS,CAAC,SAAS,CAAC,qBAAqB,CAAC,EAC1C,GAAG,EACH,WAAW,EACX,aAAa,EACb,KAAK,CACR,CAAC;IAEF,OAAO,OAAO,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../../../src/internal/sharingPublic/interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,19 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/internal/sharingPublic/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { DriveAPIService } from '../../apiService';
|
|
2
|
+
import { PublicLinkInfo, PublicLinkSrpAuth } from './interface';
|
|
3
|
+
/**
|
|
4
|
+
* Provides API communication for managing public link session (not data).
|
|
5
|
+
*
|
|
6
|
+
* The service is responsible for transforming local objects to API payloads
|
|
7
|
+
* and vice versa. It should not contain any business logic.
|
|
8
|
+
*/
|
|
9
|
+
export declare class SharingPublicSessionAPIService {
|
|
10
|
+
private apiService;
|
|
11
|
+
constructor(apiService: DriveAPIService);
|
|
12
|
+
/**
|
|
13
|
+
* Start a SRP handshake for public link session.
|
|
14
|
+
*/
|
|
15
|
+
initPublicLinkSession(token: string): Promise<PublicLinkInfo>;
|
|
16
|
+
/**
|
|
17
|
+
* Authenticate a public link session.
|
|
18
|
+
*
|
|
19
|
+
* It returns the server proof that must be validated, and the session uid
|
|
20
|
+
* with an optional access token. The access token is only returned if
|
|
21
|
+
* the session is newly created.
|
|
22
|
+
*/
|
|
23
|
+
authPublicLinkSession(token: string, srp: PublicLinkSrpAuth): Promise<{
|
|
24
|
+
serverProof: string;
|
|
25
|
+
sessionUid: string;
|
|
26
|
+
sessionAccessToken?: string;
|
|
27
|
+
}>;
|
|
28
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SharingPublicSessionAPIService = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Provides API communication for managing public link session (not data).
|
|
6
|
+
*
|
|
7
|
+
* The service is responsible for transforming local objects to API payloads
|
|
8
|
+
* and vice versa. It should not contain any business logic.
|
|
9
|
+
*/
|
|
10
|
+
class SharingPublicSessionAPIService {
|
|
11
|
+
apiService;
|
|
12
|
+
constructor(apiService) {
|
|
13
|
+
this.apiService = apiService;
|
|
14
|
+
this.apiService = apiService;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Start a SRP handshake for public link session.
|
|
18
|
+
*/
|
|
19
|
+
async initPublicLinkSession(token) {
|
|
20
|
+
const response = await this.apiService.get(`drive/urls/${token}/info`);
|
|
21
|
+
return {
|
|
22
|
+
srp: {
|
|
23
|
+
version: response.Version,
|
|
24
|
+
modulus: response.Modulus,
|
|
25
|
+
serverEphemeral: response.ServerEphemeral,
|
|
26
|
+
salt: response.UrlPasswordSalt,
|
|
27
|
+
srpSession: response.SRPSession,
|
|
28
|
+
},
|
|
29
|
+
isCustomPasswordProtected: (response.Flags & 1) === 1,
|
|
30
|
+
isLegacy: response.Flags === 0 || response.Flags === 1,
|
|
31
|
+
vendorType: response.VendorType,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Authenticate a public link session.
|
|
36
|
+
*
|
|
37
|
+
* It returns the server proof that must be validated, and the session uid
|
|
38
|
+
* with an optional access token. The access token is only returned if
|
|
39
|
+
* the session is newly created.
|
|
40
|
+
*/
|
|
41
|
+
async authPublicLinkSession(token, srp) {
|
|
42
|
+
const response = await this.apiService.post(`drive/urls/${token}/auth`, {
|
|
43
|
+
ClientProof: srp.clientProof,
|
|
44
|
+
ClientEphemeral: srp.clientEphemeral,
|
|
45
|
+
SRPSession: srp.srpSession,
|
|
46
|
+
});
|
|
47
|
+
return {
|
|
48
|
+
serverProof: response.ServerProof,
|
|
49
|
+
sessionUid: response.UID,
|
|
50
|
+
sessionAccessToken: response.AccessToken,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
exports.SharingPublicSessionAPIService = SharingPublicSessionAPIService;
|
|
55
|
+
//# sourceMappingURL=apiService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiService.js","sourceRoot":"","sources":["../../../../src/internal/sharingPublic/session/apiService.ts"],"names":[],"mappings":";;;AAaA;;;;;GAKG;AACH,MAAa,8BAA8B;IACnB;IAApB,YAAoB,UAA2B;QAA3B,eAAU,GAAV,UAAU,CAAiB;QAC3C,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,qBAAqB,CAAC,KAAa;QACrC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAA4B,cAAc,KAAK,OAAO,CAAC,CAAC;QAClG,OAAO;YACH,GAAG,EAAE;gBACD,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,eAAe,EAAE,QAAQ,CAAC,eAAe;gBACzC,IAAI,EAAE,QAAQ,CAAC,eAAe;gBAC9B,UAAU,EAAE,QAAQ,CAAC,UAAU;aAClC;YACD,yBAAyB,EAAE,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;YACrD,QAAQ,EAAE,QAAQ,CAAC,KAAK,KAAK,CAAC,IAAI,QAAQ,CAAC,KAAK,KAAK,CAAC;YACtD,UAAU,EAAE,QAAQ,CAAC,UAAU;SAClC,CAAC;IACN,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,qBAAqB,CACvB,KAAa,EACb,GAAsB;QAMtB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CACvC,cAAc,KAAK,OAAO,EAC1B;YACI,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,eAAe,EAAE,GAAG,CAAC,eAAe;YACpC,UAAU,EAAE,GAAG,CAAC,UAAU;SAC7B,CACJ,CAAC;QAEF,OAAO;YACH,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,UAAU,EAAE,QAAQ,CAAC,GAAG;YACxB,kBAAkB,EAAE,QAAQ,CAAC,WAAW;SAC3C,CAAC;IACN,CAAC;CACJ;AAtDD,wEAsDC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ProtonDriveHTTPClient, ProtonDriveHTTPClientBlobRequest, ProtonDriveHTTPClientJsonRequest } from '../../../interface';
|
|
2
|
+
import { SharingPublicLinkSession } from './session';
|
|
3
|
+
/**
|
|
4
|
+
* HTTP client to get access to public link of given session.
|
|
5
|
+
*
|
|
6
|
+
* It is responsible for adding the session headers to the request if the session
|
|
7
|
+
* is authenticated, and re-authenticating the session if the session is expired.
|
|
8
|
+
*/
|
|
9
|
+
export declare class SharingPublicSessionHttpClient implements ProtonDriveHTTPClient {
|
|
10
|
+
private httpClient;
|
|
11
|
+
private session;
|
|
12
|
+
constructor(httpClient: ProtonDriveHTTPClient, session: SharingPublicLinkSession);
|
|
13
|
+
fetchJson(options: ProtonDriveHTTPClientJsonRequest): Promise<Response>;
|
|
14
|
+
fetchBlob(options: ProtonDriveHTTPClientBlobRequest): Promise<Response>;
|
|
15
|
+
private getOptionsWithSessionHeaders;
|
|
16
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SharingPublicSessionHttpClient = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* HTTP client to get access to public link of given session.
|
|
6
|
+
*
|
|
7
|
+
* It is responsible for adding the session headers to the request if the session
|
|
8
|
+
* is authenticated, and re-authenticating the session if the session is expired.
|
|
9
|
+
*/
|
|
10
|
+
class SharingPublicSessionHttpClient {
|
|
11
|
+
httpClient;
|
|
12
|
+
session;
|
|
13
|
+
constructor(httpClient, session) {
|
|
14
|
+
this.httpClient = httpClient;
|
|
15
|
+
this.session = session;
|
|
16
|
+
this.httpClient = httpClient;
|
|
17
|
+
this.session = session;
|
|
18
|
+
}
|
|
19
|
+
async fetchJson(options) {
|
|
20
|
+
const response = await this.httpClient.fetchJson(this.getOptionsWithSessionHeaders(options));
|
|
21
|
+
if (response.status === 401 /* HTTPErrorCode.UNAUTHORIZED */) {
|
|
22
|
+
await this.session.reauth();
|
|
23
|
+
return this.httpClient.fetchJson(this.getOptionsWithSessionHeaders(options));
|
|
24
|
+
}
|
|
25
|
+
return response;
|
|
26
|
+
}
|
|
27
|
+
async fetchBlob(options) {
|
|
28
|
+
return this.httpClient.fetchBlob(this.getOptionsWithSessionHeaders(options));
|
|
29
|
+
}
|
|
30
|
+
getOptionsWithSessionHeaders(options) {
|
|
31
|
+
// Set headers if the session is newly created.
|
|
32
|
+
// This is needed only if the user is not logged in.
|
|
33
|
+
if (this.session.session.accessToken) {
|
|
34
|
+
options.headers.set('x-pm-uid', this.session.session.uid);
|
|
35
|
+
options.headers.set('Authorization', `Bearer ${this.session.session.accessToken}`);
|
|
36
|
+
}
|
|
37
|
+
return options;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.SharingPublicSessionHttpClient = SharingPublicSessionHttpClient;
|
|
41
|
+
//# sourceMappingURL=httpClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpClient.js","sourceRoot":"","sources":["../../../../src/internal/sharingPublic/session/httpClient.ts"],"names":[],"mappings":";;;AAQA;;;;;GAKG;AACH,MAAa,8BAA8B;IAE3B;IACA;IAFZ,YACY,UAAiC,EACjC,OAAiC;QADjC,eAAU,GAAV,UAAU,CAAuB;QACjC,YAAO,GAAP,OAAO,CAA0B;QAEzC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAAyC;QACrD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,4BAA4B,CAAC,OAAO,CAAC,CAAC,CAAC;QAE7F,IAAI,QAAQ,CAAC,MAAM,yCAA+B,EAAE,CAAC;YACjD,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,4BAA4B,CAAC,OAAO,CAAC,CAAC,CAAC;QACjF,CAAC;QAED,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAAyC;QACrD,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,4BAA4B,CAAC,OAAO,CAAC,CAAC,CAAC;IACjF,CAAC;IAEO,4BAA4B,CAAC,OAAyC;QAC1E,+CAA+C;QAC/C,oDAAoD;QACpD,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YACnC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC1D,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QACvF,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;CACJ;AAjCD,wEAiCC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { SharingPublicSessionManager } from './manager';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SharingPublicSessionManager = void 0;
|
|
4
|
+
var manager_1 = require("./manager");
|
|
5
|
+
Object.defineProperty(exports, "SharingPublicSessionManager", { enumerable: true, get: function () { return manager_1.SharingPublicSessionManager; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/internal/sharingPublic/session/index.ts"],"names":[],"mappings":";;;AAAA,qCAAwD;AAA/C,sHAAA,2BAA2B,OAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type PublicLinkInfo = {
|
|
2
|
+
srp: PublicLinkSrpInfo;
|
|
3
|
+
isCustomPasswordProtected: boolean;
|
|
4
|
+
isLegacy: boolean;
|
|
5
|
+
vendorType: number;
|
|
6
|
+
};
|
|
7
|
+
export type PublicLinkSrpInfo = {
|
|
8
|
+
version: number;
|
|
9
|
+
modulus: string;
|
|
10
|
+
serverEphemeral: string;
|
|
11
|
+
salt: string;
|
|
12
|
+
srpSession: string;
|
|
13
|
+
};
|
|
14
|
+
export type PublicLinkSrpAuth = {
|
|
15
|
+
clientProof: string;
|
|
16
|
+
clientEphemeral: string;
|
|
17
|
+
srpSession: string;
|
|
18
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../../../../src/internal/sharingPublic/session/interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { ProtonDriveHTTPClient } from '../../../interface';
|
|
2
|
+
import { SRPModule } from '../../../crypto';
|
|
3
|
+
import { DriveAPIService } from '../../apiService';
|
|
4
|
+
import { SharingPublicSessionHttpClient } from './httpClient';
|
|
5
|
+
/**
|
|
6
|
+
* Manages sessions for public links.
|
|
7
|
+
*
|
|
8
|
+
* It can be used to get access to multiple public links.
|
|
9
|
+
*/
|
|
10
|
+
export declare class SharingPublicSessionManager {
|
|
11
|
+
private httpClient;
|
|
12
|
+
private srpModule;
|
|
13
|
+
private api;
|
|
14
|
+
private infosPerToken;
|
|
15
|
+
constructor(httpClient: ProtonDriveHTTPClient, apiService: DriveAPIService, srpModule: SRPModule);
|
|
16
|
+
/**
|
|
17
|
+
* Get the info for a public link.
|
|
18
|
+
*
|
|
19
|
+
* It returns the info for the public link, including if it is custom
|
|
20
|
+
* password protected, if it is legacy (not supported anymore), and
|
|
21
|
+
* the vendor type (whether it is Proton Docs, for example, and should
|
|
22
|
+
* be redirected to the public Docs app).
|
|
23
|
+
*
|
|
24
|
+
* @param url - The URL of the public link.
|
|
25
|
+
*/
|
|
26
|
+
getInfo(url: string): Promise<{
|
|
27
|
+
isCustomPasswordProtected: boolean;
|
|
28
|
+
isLegacy: boolean;
|
|
29
|
+
vendorType: number;
|
|
30
|
+
}>;
|
|
31
|
+
/**
|
|
32
|
+
* Authenticate a public link session.
|
|
33
|
+
*
|
|
34
|
+
* It returns HTTP client that must be used for the endpoints to access the
|
|
35
|
+
* public link data.
|
|
36
|
+
*
|
|
37
|
+
* It returnes parsed token and full password (password from the URL +
|
|
38
|
+
* custom password) that can be used for decrypting the share key.
|
|
39
|
+
*
|
|
40
|
+
* @param url - The URL of the public link.
|
|
41
|
+
* @param customPassword - The custom password for the public link, if it is
|
|
42
|
+
* custom password protected.
|
|
43
|
+
*/
|
|
44
|
+
auth(url: string, customPassword?: string): Promise<{
|
|
45
|
+
token: string;
|
|
46
|
+
password: string;
|
|
47
|
+
httpClient: SharingPublicSessionHttpClient;
|
|
48
|
+
}>;
|
|
49
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SharingPublicSessionManager = void 0;
|
|
4
|
+
const apiService_1 = require("./apiService");
|
|
5
|
+
const httpClient_1 = require("./httpClient");
|
|
6
|
+
const session_1 = require("./session");
|
|
7
|
+
const url_1 = require("./url");
|
|
8
|
+
/**
|
|
9
|
+
* Manages sessions for public links.
|
|
10
|
+
*
|
|
11
|
+
* It can be used to get access to multiple public links.
|
|
12
|
+
*/
|
|
13
|
+
class SharingPublicSessionManager {
|
|
14
|
+
httpClient;
|
|
15
|
+
srpModule;
|
|
16
|
+
api;
|
|
17
|
+
infosPerToken = new Map();
|
|
18
|
+
constructor(httpClient, apiService, srpModule) {
|
|
19
|
+
this.httpClient = httpClient;
|
|
20
|
+
this.srpModule = srpModule;
|
|
21
|
+
this.httpClient = httpClient;
|
|
22
|
+
this.srpModule = srpModule;
|
|
23
|
+
this.api = new apiService_1.SharingPublicSessionAPIService(apiService);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Get the info for a public link.
|
|
27
|
+
*
|
|
28
|
+
* It returns the info for the public link, including if it is custom
|
|
29
|
+
* password protected, if it is legacy (not supported anymore), and
|
|
30
|
+
* the vendor type (whether it is Proton Docs, for example, and should
|
|
31
|
+
* be redirected to the public Docs app).
|
|
32
|
+
*
|
|
33
|
+
* @param url - The URL of the public link.
|
|
34
|
+
*/
|
|
35
|
+
async getInfo(url) {
|
|
36
|
+
const { token } = (0, url_1.getTokenAndPasswordFromUrl)(url);
|
|
37
|
+
const info = await this.api.initPublicLinkSession(token);
|
|
38
|
+
this.infosPerToken.set(token, info);
|
|
39
|
+
return {
|
|
40
|
+
isCustomPasswordProtected: info.isCustomPasswordProtected,
|
|
41
|
+
isLegacy: info.isLegacy,
|
|
42
|
+
vendorType: info.vendorType,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Authenticate a public link session.
|
|
47
|
+
*
|
|
48
|
+
* It returns HTTP client that must be used for the endpoints to access the
|
|
49
|
+
* public link data.
|
|
50
|
+
*
|
|
51
|
+
* It returnes parsed token and full password (password from the URL +
|
|
52
|
+
* custom password) that can be used for decrypting the share key.
|
|
53
|
+
*
|
|
54
|
+
* @param url - The URL of the public link.
|
|
55
|
+
* @param customPassword - The custom password for the public link, if it is
|
|
56
|
+
* custom password protected.
|
|
57
|
+
*/
|
|
58
|
+
async auth(url, customPassword) {
|
|
59
|
+
const { token, password: urlPassword } = (0, url_1.getTokenAndPasswordFromUrl)(url);
|
|
60
|
+
let info = this.infosPerToken.get(token);
|
|
61
|
+
if (!info) {
|
|
62
|
+
info = await this.api.initPublicLinkSession(token);
|
|
63
|
+
}
|
|
64
|
+
const password = `${urlPassword}${customPassword || ''}`;
|
|
65
|
+
const session = new session_1.SharingPublicLinkSession(this.api, this.srpModule, token, password);
|
|
66
|
+
await session.auth(info.srp);
|
|
67
|
+
return {
|
|
68
|
+
token,
|
|
69
|
+
password,
|
|
70
|
+
httpClient: new httpClient_1.SharingPublicSessionHttpClient(this.httpClient, session),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
exports.SharingPublicSessionManager = SharingPublicSessionManager;
|
|
75
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../../src/internal/sharingPublic/session/manager.ts"],"names":[],"mappings":";;;AAGA,6CAA8D;AAC9D,6CAA8D;AAE9D,uCAAqD;AACrD,+BAAmD;AAEnD;;;;GAIG;AACH,MAAa,2BAA2B;IAMxB;IAEA;IAPJ,GAAG,CAAiC;IAEpC,aAAa,GAAgC,IAAI,GAAG,EAAE,CAAC;IAE/D,YACY,UAAiC,EACzC,UAA2B,EACnB,SAAoB;QAFpB,eAAU,GAAV,UAAU,CAAuB;QAEjC,cAAS,GAAT,SAAS,CAAW;QAE5B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAE3B,IAAI,CAAC,GAAG,GAAG,IAAI,2CAA8B,CAAC,UAAU,CAAC,CAAC;IAC9D,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,OAAO,CAAC,GAAW;QAKrB,MAAM,EAAE,KAAK,EAAE,GAAG,IAAA,gCAA0B,EAAC,GAAG,CAAC,CAAC;QAElD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACzD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAEpC,OAAO;YACH,yBAAyB,EAAE,IAAI,CAAC,yBAAyB;YACzD,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU,EAAE,IAAI,CAAC,UAAU;SAC9B,CAAC;IACN,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,IAAI,CACN,GAAW,EACX,cAAuB;QAMvB,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAA,gCAA0B,EAAC,GAAG,CAAC,CAAC;QAEzE,IAAI,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,QAAQ,GAAG,GAAG,WAAW,GAAG,cAAc,IAAI,EAAE,EAAE,CAAC;QAEzD,MAAM,OAAO,GAAG,IAAI,kCAAwB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QACxF,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE7B,OAAO;YACH,KAAK;YACL,QAAQ;YACR,UAAU,EAAE,IAAI,2CAA8B,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC;SAC3E,CAAC;IACN,CAAC;CACJ;AAlFD,kEAkFC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { SRPModule } from "../../../crypto";
|
|
2
|
+
import { SharingPublicSessionAPIService } from "./apiService";
|
|
3
|
+
import { PublicLinkInfo, PublicLinkSrpInfo } from "./interface";
|
|
4
|
+
/**
|
|
5
|
+
* Session for a public link.
|
|
6
|
+
*
|
|
7
|
+
* It is responsible for initializing and authenticating the public link session
|
|
8
|
+
* with the SRP handshake. It also can re-authenticate the session if it is expired.
|
|
9
|
+
*/
|
|
10
|
+
export declare class SharingPublicLinkSession {
|
|
11
|
+
private apiService;
|
|
12
|
+
private srpModule;
|
|
13
|
+
private token;
|
|
14
|
+
private password;
|
|
15
|
+
private sessionUid?;
|
|
16
|
+
private sessionAccessToken?;
|
|
17
|
+
constructor(apiService: SharingPublicSessionAPIService, srpModule: SRPModule, token: string, password: string);
|
|
18
|
+
reauth(): Promise<void>;
|
|
19
|
+
init(): Promise<PublicLinkInfo>;
|
|
20
|
+
auth(srp: PublicLinkSrpInfo): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Get the session uid and access token.
|
|
23
|
+
*
|
|
24
|
+
* The access token is only returned if the session is newly created.
|
|
25
|
+
* If the access token is not available, it means the existing session
|
|
26
|
+
* can be used to access the public link.
|
|
27
|
+
*
|
|
28
|
+
* @throws If the session is not initialized.
|
|
29
|
+
*/
|
|
30
|
+
get session(): {
|
|
31
|
+
uid: string;
|
|
32
|
+
accessToken: string | undefined;
|
|
33
|
+
};
|
|
34
|
+
}
|