@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,134 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SharingPublicAPIService = void 0;
4
+ const apiService_1 = require("../apiService");
5
+ const uids_1 = require("../uids");
6
+ const PAGE_SIZE = 50;
7
+ /**
8
+ * Provides API communication for accessing public link data.
9
+ *
10
+ * The service is responsible for transforming local objects to API payloads
11
+ * and vice versa. It should not contain any business logic.
12
+ */
13
+ class SharingPublicAPIService {
14
+ logger;
15
+ apiService;
16
+ constructor(logger, apiService) {
17
+ this.logger = logger;
18
+ this.apiService = apiService;
19
+ this.logger = logger;
20
+ this.apiService = apiService;
21
+ }
22
+ async getPublicLinkRoot(token) {
23
+ const response = await this.apiService.get(`drive/urls/${token}`);
24
+ const encryptedNode = tokenToEncryptedNode(this.logger, response.Token);
25
+ return {
26
+ encryptedNode: encryptedNode,
27
+ encryptedShare: {
28
+ base64UrlPasswordSalt: response.Token.SharePasswordSalt,
29
+ armoredKey: response.Token.ShareKey,
30
+ armoredPassphrase: response.Token.SharePassphrase,
31
+ },
32
+ };
33
+ }
34
+ async *iterateChildren(parentUid) {
35
+ const { volumeId: token, nodeId } = (0, uids_1.splitNodeUid)(parentUid);
36
+ let page = 0;
37
+ while (true) {
38
+ const response = await this.apiService.get(`drive/urls/${token}/folders/${nodeId}/children?Page=${page}&PageSize=${PAGE_SIZE}`);
39
+ for (const link of response.Links) {
40
+ yield linkToEncryptedNode(this.logger, token, link);
41
+ }
42
+ if (response.Links.length < PAGE_SIZE) {
43
+ break;
44
+ }
45
+ page++;
46
+ }
47
+ }
48
+ }
49
+ exports.SharingPublicAPIService = SharingPublicAPIService;
50
+ function tokenToEncryptedNode(logger, token) {
51
+ const baseNodeMetadata = {
52
+ // Internal metadata
53
+ encryptedName: token.Name,
54
+ // Basic node metadata
55
+ uid: (0, uids_1.makeNodeUid)(token.Token, token.LinkID),
56
+ parentUid: undefined,
57
+ type: (0, apiService_1.nodeTypeNumberToNodeType)(logger, token.LinkType),
58
+ };
59
+ const baseCryptoNodeMetadata = {
60
+ signatureEmail: token.SignatureEmail || undefined,
61
+ armoredKey: token.NodeKey,
62
+ armoredNodePassphrase: token.NodePassphrase,
63
+ armoredNodePassphraseSignature: token.NodePassphraseSignature || undefined,
64
+ };
65
+ if (token.LinkType === 1 && token.NodeHashKey) {
66
+ return {
67
+ ...baseNodeMetadata,
68
+ encryptedCrypto: {
69
+ ...baseCryptoNodeMetadata,
70
+ folder: {
71
+ armoredHashKey: token.NodeHashKey,
72
+ },
73
+ },
74
+ };
75
+ }
76
+ if (token.LinkType === 2 && token.ContentKeyPacket) {
77
+ return {
78
+ ...baseNodeMetadata,
79
+ totalStorageSize: token.Size || undefined,
80
+ mediaType: token.MIMEType || undefined,
81
+ encryptedCrypto: {
82
+ ...baseCryptoNodeMetadata,
83
+ file: {
84
+ base64ContentKeyPacket: token.ContentKeyPacket,
85
+ },
86
+ },
87
+ };
88
+ }
89
+ throw new Error(`Unknown node type: ${token.LinkType}`);
90
+ }
91
+ function linkToEncryptedNode(logger, token, link) {
92
+ const baseNodeMetadata = {
93
+ // Internal metadata
94
+ hash: link.Hash || undefined,
95
+ encryptedName: link.Name,
96
+ // Basic node metadata
97
+ uid: (0, uids_1.makeNodeUid)(token, link.LinkID),
98
+ parentUid: link.ParentLinkID ? (0, uids_1.makeNodeUid)(token, link.ParentLinkID) : undefined,
99
+ type: (0, apiService_1.nodeTypeNumberToNodeType)(logger, link.Type),
100
+ totalStorageSize: link.TotalSize,
101
+ };
102
+ const baseCryptoNodeMetadata = {
103
+ signatureEmail: link.SignatureEmail || undefined,
104
+ armoredKey: link.NodeKey,
105
+ armoredNodePassphrase: link.NodePassphrase,
106
+ armoredNodePassphraseSignature: link.NodePassphraseSignature || undefined,
107
+ };
108
+ if (link.Type === 1 && link.FolderProperties) {
109
+ return {
110
+ ...baseNodeMetadata,
111
+ encryptedCrypto: {
112
+ ...baseCryptoNodeMetadata,
113
+ folder: {
114
+ armoredHashKey: link.FolderProperties.NodeHashKey,
115
+ },
116
+ },
117
+ };
118
+ }
119
+ if (link.Type === 2 && link.FileProperties?.ContentKeyPacket) {
120
+ return {
121
+ ...baseNodeMetadata,
122
+ totalStorageSize: link.FileProperties.ActiveRevision?.Size || undefined,
123
+ mediaType: link.MIMEType || undefined,
124
+ encryptedCrypto: {
125
+ ...baseCryptoNodeMetadata,
126
+ file: {
127
+ base64ContentKeyPacket: link.FileProperties.ContentKeyPacket,
128
+ },
129
+ },
130
+ };
131
+ }
132
+ throw new Error(`Unknown node type: ${link.Type}`);
133
+ }
134
+ //# sourceMappingURL=apiService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiService.js","sourceRoot":"","sources":["../../../src/internal/sharingPublic/apiService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
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
+ }
@@ -0,0 +1,72 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,23 @@
1
+ import { DriveCrypto, PrivateKey } from '../../crypto';
2
+ import { EncryptedShareCrypto, EncryptedNode, DecryptedNode, DecryptedNodeKeys } from './interface';
3
+ /**
4
+ * Provides crypto operations for public link data.
5
+ *
6
+ * The public link crypto service is responsible for decrypting and encrypting
7
+ * public link data. It should export high-level actions only, such as "decrypt
8
+ * share key" instead of low-level operations like "decrypt key". Low-level
9
+ * operations should be kept private to the module.
10
+ */
11
+ export declare class SharingPublicCryptoService {
12
+ private driveCrypto;
13
+ private password;
14
+ constructor(driveCrypto: DriveCrypto, password: string);
15
+ decryptShareKey(encryptedShare: EncryptedShareCrypto): Promise<PrivateKey>;
16
+ decryptNode(node: EncryptedNode, parentKey: PrivateKey): Promise<{
17
+ node: DecryptedNode;
18
+ keys?: DecryptedNodeKeys;
19
+ }>;
20
+ private decryptKey;
21
+ private decryptName;
22
+ private decryptHashKey;
23
+ }
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SharingPublicCryptoService = void 0;
4
+ const interface_1 = require("../../interface");
5
+ const errors_1 = require("../errors");
6
+ /**
7
+ * Provides crypto operations for public link data.
8
+ *
9
+ * The public link crypto service is responsible for decrypting and encrypting
10
+ * public link data. It should export high-level actions only, such as "decrypt
11
+ * share key" instead of low-level operations like "decrypt key". Low-level
12
+ * operations should be kept private to the module.
13
+ */
14
+ class SharingPublicCryptoService {
15
+ driveCrypto;
16
+ password;
17
+ constructor(driveCrypto, password) {
18
+ this.driveCrypto = driveCrypto;
19
+ this.password = password;
20
+ this.driveCrypto = driveCrypto;
21
+ this.password = password;
22
+ }
23
+ async decryptShareKey(encryptedShare) {
24
+ const { key: shareKey } = await this.driveCrypto.decryptKeyWithSrpPassword(this.password, encryptedShare.base64UrlPasswordSalt, encryptedShare.armoredKey, encryptedShare.armoredPassphrase);
25
+ return shareKey;
26
+ }
27
+ // TODO: verfiy it has all needed
28
+ async decryptNode(node, parentKey) {
29
+ const commonNodeMetadata = {
30
+ ...node,
31
+ encryptedCrypto: undefined,
32
+ };
33
+ const { name } = await this.decryptName(node, parentKey);
34
+ let passphrase, key, passphraseSessionKey;
35
+ try {
36
+ const keyResult = await this.decryptKey(node, parentKey);
37
+ passphrase = keyResult.passphrase;
38
+ key = keyResult.key;
39
+ passphraseSessionKey = keyResult.passphraseSessionKey;
40
+ }
41
+ catch (error) {
42
+ return {
43
+ node: {
44
+ ...commonNodeMetadata,
45
+ name,
46
+ errors: [error],
47
+ },
48
+ };
49
+ }
50
+ const errors = [];
51
+ let hashKey;
52
+ if ('folder' in node.encryptedCrypto) {
53
+ try {
54
+ const hashKeyResult = await this.decryptHashKey(node, key);
55
+ hashKey = hashKeyResult.hashKey;
56
+ }
57
+ catch (error) {
58
+ errors.push(error);
59
+ }
60
+ }
61
+ let contentKeyPacketSessionKey;
62
+ if ('file' in node.encryptedCrypto) {
63
+ try {
64
+ const keySessionKeyResult = await this.driveCrypto.decryptAndVerifySessionKey(node.encryptedCrypto.file.base64ContentKeyPacket, '', key, []);
65
+ contentKeyPacketSessionKey = keySessionKeyResult.sessionKey;
66
+ }
67
+ catch (error) {
68
+ errors.push(error);
69
+ }
70
+ }
71
+ return {
72
+ node: {
73
+ ...commonNodeMetadata,
74
+ name,
75
+ errors: errors.length ? errors : undefined,
76
+ },
77
+ keys: {
78
+ passphrase,
79
+ key,
80
+ passphraseSessionKey,
81
+ contentKeyPacketSessionKey,
82
+ hashKey,
83
+ },
84
+ };
85
+ }
86
+ async decryptKey(node, parentKey) {
87
+ const key = await this.driveCrypto.decryptKey(node.encryptedCrypto.armoredKey, node.encryptedCrypto.armoredNodePassphrase, '', [parentKey], []);
88
+ return {
89
+ passphrase: key.passphrase,
90
+ key: key.key,
91
+ passphraseSessionKey: key.passphraseSessionKey,
92
+ };
93
+ }
94
+ async decryptName(node, parentKey) {
95
+ try {
96
+ const { name } = await this.driveCrypto.decryptNodeName(node.encryptedName, parentKey, []);
97
+ return {
98
+ name: (0, interface_1.resultOk)(name),
99
+ };
100
+ }
101
+ catch (error) {
102
+ const errorMessage = (0, errors_1.getErrorMessage)(error);
103
+ return {
104
+ name: (0, interface_1.resultError)(new Error(errorMessage)),
105
+ };
106
+ }
107
+ }
108
+ async decryptHashKey(node, nodeKey) {
109
+ if (!('folder' in node.encryptedCrypto)) {
110
+ // This is developer error.
111
+ throw new Error('Node is not a folder');
112
+ }
113
+ const { hashKey } = await this.driveCrypto.decryptNodeHashKey(node.encryptedCrypto.folder.armoredHashKey, nodeKey, []);
114
+ return {
115
+ hashKey,
116
+ };
117
+ }
118
+ }
119
+ exports.SharingPublicCryptoService = SharingPublicCryptoService;
120
+ //# sourceMappingURL=cryptoService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cryptoService.js","sourceRoot":"","sources":["../../../src/internal/sharingPublic/cryptoService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { DriveCrypto } from '../../crypto';
2
+ import { ProtonDriveCryptoCache, ProtonDriveTelemetry } 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, 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, 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(driveCrypto, 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,0DAoBC;AApCD,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,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,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC5E,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,48 @@
1
+ import { PrivateKey, SessionKey } from "../../crypto";
2
+ import { NodeType, Result, InvalidNameError } from "../../interface";
3
+ export interface EncryptedShareCrypto {
4
+ base64UrlPasswordSalt: string;
5
+ armoredKey: string;
6
+ armoredPassphrase: string;
7
+ }
8
+ interface BaseNode {
9
+ hash?: string;
10
+ encryptedName: string;
11
+ uid: string;
12
+ parentUid?: string;
13
+ type: NodeType;
14
+ mediaType?: string;
15
+ totalStorageSize?: number;
16
+ }
17
+ export interface EncryptedNode extends BaseNode {
18
+ encryptedCrypto: EncryptedNodeFolderCrypto | EncryptedNodeFileCrypto;
19
+ }
20
+ export interface EncryptedNodeCrypto {
21
+ signatureEmail?: string;
22
+ armoredKey: string;
23
+ armoredNodePassphrase: string;
24
+ armoredNodePassphraseSignature?: string;
25
+ }
26
+ export interface EncryptedNodeFileCrypto extends EncryptedNodeCrypto {
27
+ file: {
28
+ base64ContentKeyPacket: string;
29
+ };
30
+ }
31
+ export interface EncryptedNodeFolderCrypto extends EncryptedNodeCrypto {
32
+ folder: {
33
+ armoredExtendedAttributes?: string;
34
+ armoredHashKey: string;
35
+ };
36
+ }
37
+ export interface DecryptedNode extends BaseNode {
38
+ name: Result<string, Error | InvalidNameError>;
39
+ errors?: unknown[];
40
+ }
41
+ export interface DecryptedNodeKeys {
42
+ passphrase: string;
43
+ key: PrivateKey;
44
+ passphraseSessionKey: SessionKey;
45
+ contentKeyPacketSessionKey?: SessionKey;
46
+ hashKey?: Uint8Array;
47
+ }
48
+ export {};
@@ -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/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
+ iterateChildren(parentUid: string): AsyncGenerator<DecryptedNode>;
15
+ private decryptShare;
16
+ private decryptNode;
17
+ private getParentKey;
18
+ getNodeKeys(nodeUid: string): Promise<DecryptedNodeKeys>;
19
+ }
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SharingPublicManager = void 0;
4
+ // TODO: comment
5
+ class SharingPublicManager {
6
+ logger;
7
+ api;
8
+ cryptoCache;
9
+ cryptoService;
10
+ token;
11
+ constructor(logger, api, cryptoCache, cryptoService, token) {
12
+ this.logger = logger;
13
+ this.api = api;
14
+ this.cryptoCache = cryptoCache;
15
+ this.cryptoService = cryptoService;
16
+ this.token = token;
17
+ this.logger = logger;
18
+ this.api = api;
19
+ this.cryptoCache = cryptoCache;
20
+ this.cryptoService = cryptoService;
21
+ this.token = token;
22
+ }
23
+ async getRootNode() {
24
+ const { encryptedNode, encryptedShare } = await this.api.getPublicLinkRoot(this.token);
25
+ await this.decryptShare(encryptedShare);
26
+ return this.decryptNode(encryptedNode);
27
+ }
28
+ async *iterateChildren(parentUid) {
29
+ // TODO: optimise this - decrypt in parallel
30
+ for await (const node of this.api.iterateChildren(parentUid)) {
31
+ const decryptedNode = await this.decryptNode(node);
32
+ yield decryptedNode;
33
+ }
34
+ }
35
+ async decryptShare(encryptedShare) {
36
+ const shareKey = await this.cryptoService.decryptShareKey(encryptedShare);
37
+ await this.cryptoCache.setShareKey(shareKey);
38
+ }
39
+ async decryptNode(encryptedNode) {
40
+ const parentKey = await this.getParentKey(encryptedNode);
41
+ const { node: decryptedNode, keys } = await this.cryptoService.decryptNode(encryptedNode, parentKey);
42
+ // TODO: cache of metadata?
43
+ if (keys) {
44
+ try {
45
+ await this.cryptoCache.setNodeKeys(decryptedNode.uid, keys);
46
+ }
47
+ catch (error) {
48
+ this.logger.error(`Failed to cache node keys ${decryptedNode.uid}`, error);
49
+ }
50
+ }
51
+ return decryptedNode;
52
+ }
53
+ async getParentKey(node) {
54
+ if (node.parentUid) {
55
+ // TODO: try-catch
56
+ const keys = await this.getNodeKeys(node.parentUid);
57
+ return keys.key;
58
+ }
59
+ try {
60
+ return await this.cryptoCache.getShareKey();
61
+ }
62
+ catch {
63
+ await this.getRootNode();
64
+ return this.cryptoCache.getShareKey();
65
+ }
66
+ }
67
+ async getNodeKeys(nodeUid) {
68
+ try {
69
+ const keys = await this.cryptoCache.getNodeKeys(nodeUid);
70
+ return keys;
71
+ }
72
+ catch {
73
+ // TODO: handle this
74
+ throw new Error('Node key not found in cache');
75
+ }
76
+ }
77
+ }
78
+ exports.SharingPublicManager = SharingPublicManager;
79
+ //# 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
+ }