@protontech/drive-sdk 0.3.0 → 0.3.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.
Files changed (121) hide show
  1. package/dist/crypto/interface.d.ts +5 -0
  2. package/dist/diagnostic/httpClient.d.ts +3 -3
  3. package/dist/interface/httpClient.d.ts +5 -5
  4. package/dist/interface/index.d.ts +15 -5
  5. package/dist/internal/apiService/apiService.js +1 -1
  6. package/dist/internal/apiService/apiService.js.map +1 -1
  7. package/dist/internal/apiService/errorCodes.d.ts +1 -0
  8. package/dist/internal/apiService/errorCodes.js.map +1 -1
  9. package/dist/internal/apiService/errors.d.ts +4 -3
  10. package/dist/internal/apiService/errors.js +7 -4
  11. package/dist/internal/apiService/errors.js.map +1 -1
  12. package/dist/internal/apiService/errors.test.js +2 -1
  13. package/dist/internal/apiService/errors.test.js.map +1 -1
  14. package/dist/internal/events/index.d.ts +1 -1
  15. package/dist/internal/nodes/cryptoCache.js +6 -7
  16. package/dist/internal/nodes/cryptoCache.js.map +1 -1
  17. package/dist/internal/nodes/cryptoCache.test.js +4 -7
  18. package/dist/internal/nodes/cryptoCache.test.js.map +1 -1
  19. package/dist/internal/shares/cryptoCache.d.ts +4 -3
  20. package/dist/internal/shares/cryptoCache.js +23 -6
  21. package/dist/internal/shares/cryptoCache.js.map +1 -1
  22. package/dist/internal/shares/cryptoCache.test.js +3 -2
  23. package/dist/internal/shares/cryptoCache.test.js.map +1 -1
  24. package/dist/internal/shares/index.js +1 -1
  25. package/dist/internal/shares/index.js.map +1 -1
  26. package/dist/internal/sharing/cryptoService.js +8 -6
  27. package/dist/internal/sharing/cryptoService.js.map +1 -1
  28. package/dist/internal/sharing/cryptoService.test.js +13 -0
  29. package/dist/internal/sharing/cryptoService.test.js.map +1 -1
  30. package/dist/internal/sharing/index.js +1 -1
  31. package/dist/internal/sharing/index.js.map +1 -1
  32. package/dist/internal/sharing/sharingManagement.d.ts +3 -1
  33. package/dist/internal/sharing/sharingManagement.js +10 -1
  34. package/dist/internal/sharing/sharingManagement.js.map +1 -1
  35. package/dist/internal/sharing/sharingManagement.test.js +32 -1
  36. package/dist/internal/sharing/sharingManagement.test.js.map +1 -1
  37. package/dist/internal/sharingPublic/apiService.d.ts +19 -0
  38. package/dist/internal/sharingPublic/apiService.js +134 -0
  39. package/dist/internal/sharingPublic/apiService.js.map +1 -0
  40. package/dist/internal/sharingPublic/cryptoCache.d.ts +19 -0
  41. package/dist/internal/sharingPublic/cryptoCache.js +72 -0
  42. package/dist/internal/sharingPublic/cryptoCache.js.map +1 -0
  43. package/dist/internal/sharingPublic/cryptoService.d.ts +23 -0
  44. package/dist/internal/sharingPublic/cryptoService.js +120 -0
  45. package/dist/internal/sharingPublic/cryptoService.js.map +1 -0
  46. package/dist/internal/sharingPublic/index.d.ts +15 -0
  47. package/dist/internal/sharingPublic/index.js +27 -0
  48. package/dist/internal/sharingPublic/index.js.map +1 -0
  49. package/dist/internal/sharingPublic/interface.d.ts +48 -0
  50. package/dist/internal/sharingPublic/interface.js +3 -0
  51. package/dist/internal/sharingPublic/interface.js.map +1 -0
  52. package/dist/internal/sharingPublic/manager.d.ts +19 -0
  53. package/dist/internal/sharingPublic/manager.js +79 -0
  54. package/dist/internal/sharingPublic/manager.js.map +1 -0
  55. package/dist/internal/sharingPublic/session/apiService.d.ts +28 -0
  56. package/dist/internal/sharingPublic/session/apiService.js +55 -0
  57. package/dist/internal/sharingPublic/session/apiService.js.map +1 -0
  58. package/dist/internal/sharingPublic/session/httpClient.d.ts +16 -0
  59. package/dist/internal/sharingPublic/session/httpClient.js +41 -0
  60. package/dist/internal/sharingPublic/session/httpClient.js.map +1 -0
  61. package/dist/internal/sharingPublic/session/index.d.ts +1 -0
  62. package/dist/internal/sharingPublic/session/index.js +6 -0
  63. package/dist/internal/sharingPublic/session/index.js.map +1 -0
  64. package/dist/internal/sharingPublic/session/interface.d.ts +18 -0
  65. package/dist/internal/sharingPublic/session/interface.js +3 -0
  66. package/dist/internal/sharingPublic/session/interface.js.map +1 -0
  67. package/dist/internal/sharingPublic/session/manager.d.ts +49 -0
  68. package/dist/internal/sharingPublic/session/manager.js +75 -0
  69. package/dist/internal/sharingPublic/session/manager.js.map +1 -0
  70. package/dist/internal/sharingPublic/session/session.d.ts +34 -0
  71. package/dist/internal/sharingPublic/session/session.js +67 -0
  72. package/dist/internal/sharingPublic/session/session.js.map +1 -0
  73. package/dist/internal/sharingPublic/session/url.d.ts +12 -0
  74. package/dist/internal/sharingPublic/session/url.js +23 -0
  75. package/dist/internal/sharingPublic/session/url.js.map +1 -0
  76. package/dist/internal/sharingPublic/session/url.test.d.ts +1 -0
  77. package/dist/internal/sharingPublic/session/url.test.js +59 -0
  78. package/dist/internal/sharingPublic/session/url.test.js.map +1 -0
  79. package/dist/protonDriveClient.d.ts +18 -3
  80. package/dist/protonDriveClient.js +30 -8
  81. package/dist/protonDriveClient.js.map +1 -1
  82. package/dist/protonDrivePublicLinkClient.d.ts +48 -0
  83. package/dist/protonDrivePublicLinkClient.js +71 -0
  84. package/dist/protonDrivePublicLinkClient.js.map +1 -0
  85. package/package.json +1 -1
  86. package/src/crypto/interface.ts +11 -0
  87. package/src/diagnostic/httpClient.ts +4 -4
  88. package/src/interface/httpClient.ts +5 -5
  89. package/src/interface/index.ts +18 -6
  90. package/src/internal/apiService/apiService.ts +1 -1
  91. package/src/internal/apiService/errorCodes.ts +1 -0
  92. package/src/internal/apiService/errors.test.ts +2 -1
  93. package/src/internal/apiService/errors.ts +15 -4
  94. package/src/internal/events/index.ts +1 -1
  95. package/src/internal/nodes/cryptoCache.test.ts +4 -7
  96. package/src/internal/nodes/cryptoCache.ts +6 -7
  97. package/src/internal/nodes/interface.ts +2 -0
  98. package/src/internal/shares/cryptoCache.test.ts +3 -2
  99. package/src/internal/shares/cryptoCache.ts +26 -7
  100. package/src/internal/shares/index.ts +1 -1
  101. package/src/internal/sharing/cryptoService.test.ts +22 -1
  102. package/src/internal/sharing/cryptoService.ts +8 -6
  103. package/src/internal/sharing/index.ts +1 -0
  104. package/src/internal/sharing/sharingManagement.test.ts +33 -0
  105. package/src/internal/sharing/sharingManagement.ts +9 -0
  106. package/src/internal/sharingPublic/apiService.ts +164 -0
  107. package/src/internal/sharingPublic/cryptoCache.ts +79 -0
  108. package/src/internal/sharingPublic/cryptoService.ts +162 -0
  109. package/src/internal/sharingPublic/index.ts +40 -0
  110. package/src/internal/sharingPublic/interface.ts +59 -0
  111. package/src/internal/sharingPublic/manager.ts +85 -0
  112. package/src/internal/sharingPublic/session/apiService.ts +74 -0
  113. package/src/internal/sharingPublic/session/httpClient.ts +48 -0
  114. package/src/internal/sharingPublic/session/index.ts +1 -0
  115. package/src/internal/sharingPublic/session/interface.ts +20 -0
  116. package/src/internal/sharingPublic/session/manager.ts +97 -0
  117. package/src/internal/sharingPublic/session/session.ts +78 -0
  118. package/src/internal/sharingPublic/session/url.test.ts +72 -0
  119. package/src/internal/sharingPublic/session/url.ts +23 -0
  120. package/src/protonDriveClient.ts +47 -11
  121. package/src/protonDrivePublicLinkClient.ts +121 -0
@@ -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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=interface.js.map
@@ -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
+ }
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SharingPublicLinkSession = void 0;
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
+ class SharingPublicLinkSession {
11
+ apiService;
12
+ srpModule;
13
+ token;
14
+ password;
15
+ sessionUid;
16
+ sessionAccessToken;
17
+ constructor(apiService, srpModule, token, password) {
18
+ this.apiService = apiService;
19
+ this.srpModule = srpModule;
20
+ this.token = token;
21
+ this.password = password;
22
+ this.apiService = apiService;
23
+ this.srpModule = srpModule;
24
+ this.token = token;
25
+ this.password = password;
26
+ }
27
+ async reauth() {
28
+ const info = await this.init();
29
+ await this.auth(info.srp);
30
+ }
31
+ async init() {
32
+ return this.apiService.initPublicLinkSession(this.token);
33
+ }
34
+ async auth(srp) {
35
+ const { expectedServerProof, clientProof, clientEphemeral } = await this.srpModule.getSrp(srp.version, srp.modulus, srp.serverEphemeral, srp.salt, this.password);
36
+ const auth = await this.apiService.authPublicLinkSession(this.token, {
37
+ clientProof,
38
+ clientEphemeral,
39
+ srpSession: srp.srpSession,
40
+ });
41
+ if (auth.serverProof !== expectedServerProof) {
42
+ throw new Error('Invalid server proof');
43
+ }
44
+ this.sessionUid = auth.sessionUid;
45
+ this.sessionAccessToken = auth.sessionAccessToken;
46
+ }
47
+ /**
48
+ * Get the session uid and access token.
49
+ *
50
+ * The access token is only returned if the session is newly created.
51
+ * If the access token is not available, it means the existing session
52
+ * can be used to access the public link.
53
+ *
54
+ * @throws If the session is not initialized.
55
+ */
56
+ get session() {
57
+ if (!this.sessionUid) {
58
+ throw new Error('Session not initialized');
59
+ }
60
+ return {
61
+ uid: this.sessionUid,
62
+ accessToken: this.sessionAccessToken,
63
+ };
64
+ }
65
+ }
66
+ exports.SharingPublicLinkSession = SharingPublicLinkSession;
67
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../../src/internal/sharingPublic/session/session.ts"],"names":[],"mappings":";;;AAIA;;;;;GAKG;AACH,MAAa,wBAAwB;IAKrB;IACA;IACA;IACA;IAPJ,UAAU,CAAU;IACpB,kBAAkB,CAAU;IAEpC,YACY,UAA0C,EAC1C,SAAoB,EACpB,KAAa,EACb,QAAgB;QAHhB,eAAU,GAAV,UAAU,CAAgC;QAC1C,cAAS,GAAT,SAAS,CAAW;QACpB,UAAK,GAAL,KAAK,CAAQ;QACb,aAAQ,GAAR,QAAQ,CAAQ;QAExB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,MAAM;QACR,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,IAAI;QACN,OAAO,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAsB;QAC7B,MAAM,EAAE,mBAAmB,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CACrF,GAAG,CAAC,OAAO,EACX,GAAG,CAAC,OAAO,EACX,GAAG,CAAC,eAAe,EACnB,GAAG,CAAC,IAAI,EACR,IAAI,CAAC,QAAQ,CAChB,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,EAAE;YACjE,WAAW;YACX,eAAe;YACf,UAAU,EAAE,GAAG,CAAC,UAAU;SAC7B,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,WAAW,KAAK,mBAAmB,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAClC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;IACtD,CAAC;IAED;;;;;;;;OAQG;IACH,IAAI,OAAO;QACP,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC/C,CAAC;QAED,OAAO;YACH,GAAG,EAAE,IAAI,CAAC,UAAU;YACpB,WAAW,EAAE,IAAI,CAAC,kBAAkB;SACvC,CAAC;IACN,CAAC;CACJ;AAnED,4DAmEC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Parse the token and password from the URL.
3
+ *
4
+ * The URL format is: https://drive.proton.me/urls/token#password
5
+ *
6
+ * @param url - The URL of the public link.
7
+ * @returns The token and password.
8
+ */
9
+ export declare function getTokenAndPasswordFromUrl(url: string): {
10
+ token: string;
11
+ password: string;
12
+ };
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getTokenAndPasswordFromUrl = getTokenAndPasswordFromUrl;
4
+ const ttag_1 = require("ttag");
5
+ const errors_1 = require("../../../errors");
6
+ /**
7
+ * Parse the token and password from the URL.
8
+ *
9
+ * The URL format is: https://drive.proton.me/urls/token#password
10
+ *
11
+ * @param url - The URL of the public link.
12
+ * @returns The token and password.
13
+ */
14
+ function getTokenAndPasswordFromUrl(url) {
15
+ const urlObj = new URL(url);
16
+ const token = urlObj.pathname.split('/').pop();
17
+ const password = urlObj.hash.slice(1);
18
+ if (!token || !password) {
19
+ throw new errors_1.ValidationError((0, ttag_1.c)('Error').t `Invalid URL`);
20
+ }
21
+ return { token, password };
22
+ }
23
+ //# sourceMappingURL=url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.js","sourceRoot":"","sources":["../../../../src/internal/sharingPublic/session/url.ts"],"names":[],"mappings":";;AAYA,gEAUC;AAtBD,+BAAyB;AAEzB,4CAAkD;AAElD;;;;;;;GAOG;AACH,SAAgB,0BAA0B,CAAC,GAAW;IAClD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IAC/C,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEtC,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtB,MAAM,IAAI,wBAAe,CAAC,IAAA,QAAC,EAAC,OAAO,CAAC,CAAC,CAAC,CAAA,aAAa,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AAC/B,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const errors_1 = require("../../../errors");
4
+ const url_1 = require("./url");
5
+ describe('getTokenAndPasswordFromUrl', () => {
6
+ describe('valid URLs', () => {
7
+ it('should extract token and password from a valid URL', () => {
8
+ const url = 'https://drive.proton.me/urls/abc123#def456';
9
+ const result = (0, url_1.getTokenAndPasswordFromUrl)(url);
10
+ expect(result).toEqual({
11
+ token: 'abc123',
12
+ password: 'def456'
13
+ });
14
+ });
15
+ it('should handle URLs with different domains', () => {
16
+ const url = 'https://example.com/urls/mytoken#mypassword';
17
+ const result = (0, url_1.getTokenAndPasswordFromUrl)(url);
18
+ expect(result).toEqual({
19
+ token: 'mytoken',
20
+ password: 'mypassword'
21
+ });
22
+ });
23
+ it('should handle URLs with query parameters', () => {
24
+ const url = 'https://drive.proton.me/urls/token123?param=value#password456';
25
+ const result = (0, url_1.getTokenAndPasswordFromUrl)(url);
26
+ expect(result).toEqual({
27
+ token: 'token123',
28
+ password: 'password456'
29
+ });
30
+ });
31
+ });
32
+ describe('should throw ValidationError', () => {
33
+ it('when token is missing (no path)', () => {
34
+ const url = 'https://drive.proton.me/#password123';
35
+ expect(() => (0, url_1.getTokenAndPasswordFromUrl)(url)).toThrow(errors_1.ValidationError);
36
+ });
37
+ it('when token is missing (empty path segment)', () => {
38
+ const url = 'https://drive.proton.me/urls/#password123';
39
+ expect(() => (0, url_1.getTokenAndPasswordFromUrl)(url)).toThrow(errors_1.ValidationError);
40
+ });
41
+ it('when password is missing (no hash)', () => {
42
+ const url = 'https://drive.proton.me/urls/token123';
43
+ expect(() => (0, url_1.getTokenAndPasswordFromUrl)(url)).toThrow(errors_1.ValidationError);
44
+ expect(() => (0, url_1.getTokenAndPasswordFromUrl)(url)).toThrow('Invalid URL');
45
+ });
46
+ it('when password is empty (empty hash)', () => {
47
+ const url = 'https://drive.proton.me/urls/token123#';
48
+ expect(() => (0, url_1.getTokenAndPasswordFromUrl)(url)).toThrow(errors_1.ValidationError);
49
+ expect(() => (0, url_1.getTokenAndPasswordFromUrl)(url)).toThrow('Invalid URL');
50
+ });
51
+ it('for empty string', () => {
52
+ expect(() => (0, url_1.getTokenAndPasswordFromUrl)('')).toThrow();
53
+ });
54
+ it('for invalid URL format', () => {
55
+ expect(() => (0, url_1.getTokenAndPasswordFromUrl)('not-a-url')).toThrow();
56
+ });
57
+ });
58
+ });
59
+ //# sourceMappingURL=url.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.test.js","sourceRoot":"","sources":["../../../../src/internal/sharingPublic/session/url.test.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { ProtonDriveClientContructorParameters, NodeOrUid, MaybeNode, MaybeMissingNode, NodeResult, Revision, RevisionOrUid, ShareNodeSettings, UnshareNodeSettings, ProtonInvitationOrUid, NonProtonInvitationOrUid, ProtonInvitationWithNode, MaybeBookmark, BookmarkOrUid, ShareResult, Device, DeviceType, DeviceOrUid, UploadMetadata, FileDownloader, FileUploader, FileRevisionUploader, ThumbnailType, ThumbnailResult, SDKEvent } from './interface';
2
1
  import { SessionKey } from './crypto';
3
- import { DriveListener } from './internal/events';
4
- import { EventSubscription } from './internal/events/interface';
2
+ import { ProtonDriveClientContructorParameters, NodeOrUid, MaybeNode, MaybeMissingNode, NodeResult, Revision, RevisionOrUid, ShareNodeSettings, UnshareNodeSettings, ProtonInvitationOrUid, NonProtonInvitationOrUid, ProtonInvitationWithNode, MaybeBookmark, BookmarkOrUid, ShareResult, Device, DeviceType, DeviceOrUid, UploadMetadata, FileDownloader, FileUploader, FileRevisionUploader, ThumbnailType, ThumbnailResult, SDKEvent } from './interface';
3
+ import { DriveListener, EventSubscription } from './internal/events';
4
+ import { ProtonDrivePublicLinkClient } from './protonDrivePublicLinkClient';
5
5
  /**
6
6
  * ProtonDriveClient is the main interface for the ProtonDrive SDK.
7
7
  *
@@ -19,6 +19,7 @@ export declare class ProtonDriveClient {
19
19
  private download;
20
20
  private upload;
21
21
  private devices;
22
+ private sessionManager;
22
23
  experimental: {
23
24
  /**
24
25
  * Experimental feature to return the URL of the node.
@@ -34,6 +35,20 @@ export declare class ProtonDriveClient {
34
35
  * This is used by Docs app to encrypt and decrypt document updates.
35
36
  */
36
37
  getDocsKey: (nodeUid: NodeOrUid) => Promise<SessionKey>;
38
+ /**
39
+ * Experimental feature to get the info for a public link
40
+ * required to authenticate the public link.
41
+ */
42
+ getPublicLinkInfo: (url: string) => Promise<{
43
+ isCustomPasswordProtected: boolean;
44
+ isLegacy: boolean;
45
+ vendorType: number;
46
+ }>;
47
+ /**
48
+ * Experimental feature to authenticate a public link and
49
+ * return the client for the public link to access it.
50
+ */
51
+ authPublicLink: (url: string, customPassword?: string) => Promise<ProtonDrivePublicLinkClient>;
37
52
  };
38
53
  constructor({ httpClient, entitiesCache, cryptoCache, account, openPGPCryptoModule, srpModule, config, telemetry, latestEventIdProvider, }: ProtonDriveClientContructorParameters);
39
54
  /**
@@ -1,20 +1,22 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ProtonDriveClient = void 0;
4
+ const config_1 = require("./config");
4
5
  const crypto_1 = require("./crypto");
6
+ const transformers_1 = require("./transformers");
7
+ const telemetry_1 = require("./telemetry");
5
8
  const apiService_1 = require("./internal/apiService");
6
- const shares_1 = require("./internal/shares");
7
- const nodes_1 = require("./internal/nodes");
8
- const sharing_1 = require("./internal/sharing");
9
+ const devices_1 = require("./internal/devices");
9
10
  const download_1 = require("./internal/download");
10
- const upload_1 = require("./internal/upload");
11
11
  const events_1 = require("./internal/events");
12
+ const nodes_1 = require("./internal/nodes");
12
13
  const sdkEvents_1 = require("./internal/sdkEvents");
13
- const config_1 = require("./config");
14
- const transformers_1 = require("./transformers");
15
- const telemetry_1 = require("./telemetry");
16
- const devices_1 = require("./internal/devices");
14
+ const shares_1 = require("./internal/shares");
15
+ const sharing_1 = require("./internal/sharing");
16
+ const sharingPublic_1 = require("./internal/sharingPublic");
17
+ const upload_1 = require("./internal/upload");
17
18
  const uids_1 = require("./internal/uids");
19
+ const protonDrivePublicLinkClient_1 = require("./protonDrivePublicLinkClient");
18
20
  /**
19
21
  * ProtonDriveClient is the main interface for the ProtonDrive SDK.
20
22
  *
@@ -32,6 +34,7 @@ class ProtonDriveClient {
32
34
  download;
33
35
  upload;
34
36
  devices;
37
+ sessionManager;
35
38
  experimental;
36
39
  constructor({ httpClient, entitiesCache, cryptoCache, account, openPGPCryptoModule, srpModule, config, telemetry, latestEventIdProvider, }) {
37
40
  if (!telemetry) {
@@ -54,6 +57,7 @@ class ProtonDriveClient {
54
57
  this.sharing.eventHandler.handleDriveEvent.bind(this.sharing.eventHandler),
55
58
  ];
56
59
  this.events = new events_1.DriveEventsService(telemetry, apiService, this.shares, cacheEventListeners, latestEventIdProvider);
60
+ this.sessionManager = new sharingPublic_1.SharingPublicSessionManager(httpClient, apiService, srpModule);
57
61
  this.experimental = {
58
62
  getNodeUrl: async (nodeUid) => {
59
63
  this.logger.debug(`Getting node URL for ${(0, transformers_1.getUid)(nodeUid)}`);
@@ -67,6 +71,24 @@ class ProtonDriveClient {
67
71
  }
68
72
  return keys.contentKeyPacketSessionKey;
69
73
  },
74
+ getPublicLinkInfo: async (url) => {
75
+ this.logger.info(`Getting info for public link ${url}`);
76
+ return this.sessionManager.getInfo(url);
77
+ },
78
+ authPublicLink: async (url, customPassword) => {
79
+ this.logger.info(`Authenticating public link ${url}`);
80
+ const { httpClient, token, password } = await this.sessionManager.auth(url, customPassword);
81
+ return new protonDrivePublicLinkClient_1.ProtonDrivePublicLinkClient({
82
+ httpClient,
83
+ cryptoCache,
84
+ openPGPCryptoModule,
85
+ srpModule,
86
+ config,
87
+ telemetry,
88
+ token,
89
+ password,
90
+ });
91
+ },
70
92
  };
71
93
  }
72
94
  /**