@protontech/drive-sdk 0.14.10 → 0.15.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 (366) hide show
  1. package/README.md +5 -0
  2. package/dist/cache/index.d.ts +1 -1
  3. package/dist/cache/memoryCache.d.ts +1 -1
  4. package/dist/cache/nullCache.d.ts +1 -1
  5. package/dist/crypto/driveCrypto.d.ts +8 -12
  6. package/dist/crypto/driveCrypto.js +36 -39
  7. package/dist/crypto/driveCrypto.js.map +1 -1
  8. package/dist/crypto/driveCrypto.test.js +1 -21
  9. package/dist/crypto/driveCrypto.test.js.map +1 -1
  10. package/dist/crypto/index.d.ts +2 -4
  11. package/dist/crypto/index.js +3 -6
  12. package/dist/crypto/index.js.map +1 -1
  13. package/dist/crypto/interface.d.ts +3 -35
  14. package/dist/crypto/interface.js +0 -7
  15. package/dist/crypto/interface.js.map +1 -1
  16. package/dist/crypto/openPGPCrypto.d.ts +10 -106
  17. package/dist/crypto/openPGPCrypto.js +2 -4
  18. package/dist/crypto/openPGPCrypto.js.map +1 -1
  19. package/dist/diagnostic/index.d.ts +1 -1
  20. package/dist/diagnostic/index.js +1 -1
  21. package/dist/diagnostic/index.js.map +1 -1
  22. package/dist/diagnostic/integrityVerificationStream.js +1 -2
  23. package/dist/diagnostic/integrityVerificationStream.js.map +1 -1
  24. package/dist/diagnostic/interface.d.ts +1 -1
  25. package/dist/diagnostic/nodeUtils.d.ts +1 -1
  26. package/dist/diagnostic/sdkDiagnosticBase.d.ts +2 -2
  27. package/dist/diagnostic/sdkDiagnosticBase.js.map +1 -1
  28. package/dist/diagnostic/sdkDiagnosticMain.js +1 -1
  29. package/dist/diagnostic/sdkDiagnosticMain.js.map +1 -1
  30. package/dist/diagnostic/sdkDiagnosticPhotos.js +1 -1
  31. package/dist/diagnostic/sdkDiagnosticPhotos.js.map +1 -1
  32. package/dist/index.d.ts +4 -3
  33. package/dist/index.js +2 -2
  34. package/dist/index.js.map +1 -1
  35. package/dist/interface/account.d.ts +1 -1
  36. package/dist/interface/devices.d.ts +1 -1
  37. package/dist/interface/index.d.ts +15 -15
  38. package/dist/interface/index.js +7 -7
  39. package/dist/interface/index.js.map +1 -1
  40. package/dist/interface/nodes.d.ts +1 -1
  41. package/dist/interface/photos.d.ts +1 -1
  42. package/dist/interface/sharing.d.ts +2 -2
  43. package/dist/internal/apiService/apiService.js +1 -1
  44. package/dist/internal/apiService/apiService.js.map +1 -1
  45. package/dist/internal/apiService/coreTypes.d.ts +8552 -7249
  46. package/dist/internal/apiService/driveTypes.d.ts +47 -92
  47. package/dist/internal/apiService/errors.test.js +1 -1
  48. package/dist/internal/apiService/errors.test.js.map +1 -1
  49. package/dist/internal/apiService/index.d.ts +4 -4
  50. package/dist/internal/apiService/index.js +5 -5
  51. package/dist/internal/apiService/index.js.map +1 -1
  52. package/dist/internal/apiService/transformers.d.ts +1 -1
  53. package/dist/internal/devices/index.d.ts +1 -1
  54. package/dist/internal/devices/manager.test.js +1 -1
  55. package/dist/internal/devices/manager.test.js.map +1 -1
  56. package/dist/internal/download/cryptoService.js +3 -2
  57. package/dist/internal/download/cryptoService.js.map +1 -1
  58. package/dist/internal/download/fileDownloader.js +8 -7
  59. package/dist/internal/download/fileDownloader.js.map +1 -1
  60. package/dist/internal/download/fileDownloader.test.js +1 -1
  61. package/dist/internal/download/fileDownloader.test.js.map +1 -1
  62. package/dist/internal/download/index.d.ts +2 -2
  63. package/dist/internal/download/index.js +1 -1
  64. package/dist/internal/download/index.js.map +1 -1
  65. package/dist/internal/download/interface.d.ts +1 -1
  66. package/dist/internal/download/telemetry.js +2 -3
  67. package/dist/internal/download/telemetry.js.map +1 -1
  68. package/dist/internal/download/telemetry.test.js +5 -0
  69. package/dist/internal/download/telemetry.test.js.map +1 -1
  70. package/dist/internal/download/thumbnailDownloader.d.ts +1 -1
  71. package/dist/internal/download/thumbnailDownloader.js +1 -1
  72. package/dist/internal/download/thumbnailDownloader.js.map +1 -1
  73. package/dist/internal/download/thumbnailDownloader.test.js.map +1 -1
  74. package/dist/internal/errors.d.ts +1 -0
  75. package/dist/internal/errors.js +11 -0
  76. package/dist/internal/errors.js.map +1 -1
  77. package/dist/internal/events/coreEventManager.test.js +1 -1
  78. package/dist/internal/events/coreEventManager.test.js.map +1 -1
  79. package/dist/internal/events/eventManager.d.ts +1 -1
  80. package/dist/internal/events/eventManager.js +1 -0
  81. package/dist/internal/events/eventManager.js.map +1 -1
  82. package/dist/internal/events/index.js +1 -1
  83. package/dist/internal/events/index.js.map +1 -1
  84. package/dist/internal/events/interface.d.ts +8 -0
  85. package/dist/internal/events/interface.js.map +1 -1
  86. package/dist/internal/events/volumeEventManager.js +1 -1
  87. package/dist/internal/events/volumeEventManager.js.map +1 -1
  88. package/dist/internal/events/volumeEventManager.test.js +1 -1
  89. package/dist/internal/events/volumeEventManager.test.js.map +1 -1
  90. package/dist/internal/nodes/apiService.d.ts +10 -4
  91. package/dist/internal/nodes/apiService.js +6 -2
  92. package/dist/internal/nodes/apiService.js.map +1 -1
  93. package/dist/internal/nodes/apiService.test.js +6 -2
  94. package/dist/internal/nodes/apiService.test.js.map +1 -1
  95. package/dist/internal/nodes/cache.d.ts +1 -1
  96. package/dist/internal/nodes/cryptoCache.d.ts +1 -1
  97. package/dist/internal/nodes/cryptoCache.test.js.map +1 -1
  98. package/dist/internal/nodes/cryptoReporter.d.ts +1 -1
  99. package/dist/internal/nodes/cryptoService.d.ts +2 -2
  100. package/dist/internal/nodes/cryptoService.js +2 -2
  101. package/dist/internal/nodes/cryptoService.js.map +1 -1
  102. package/dist/internal/nodes/cryptoService.test.js +1 -1
  103. package/dist/internal/nodes/cryptoService.test.js.map +1 -1
  104. package/dist/internal/nodes/events.test.js.map +1 -1
  105. package/dist/internal/nodes/index.d.ts +4 -4
  106. package/dist/internal/nodes/index.js +2 -2
  107. package/dist/internal/nodes/index.js.map +1 -1
  108. package/dist/internal/nodes/index.test.js +3 -3
  109. package/dist/internal/nodes/index.test.js.map +1 -1
  110. package/dist/internal/nodes/interface.d.ts +1 -1
  111. package/dist/internal/nodes/nodesAccess.d.ts +2 -2
  112. package/dist/internal/nodes/nodesAccess.js +3 -3
  113. package/dist/internal/nodes/nodesAccess.js.map +1 -1
  114. package/dist/internal/nodes/nodesAccess.test.js +4 -4
  115. package/dist/internal/nodes/nodesAccess.test.js.map +1 -1
  116. package/dist/internal/nodes/nodesManagement.d.ts +1 -1
  117. package/dist/internal/nodes/nodesManagement.js +4 -4
  118. package/dist/internal/nodes/nodesManagement.js.map +1 -1
  119. package/dist/internal/nodes/nodesManagement.test.js +7 -7
  120. package/dist/internal/nodes/nodesManagement.test.js.map +1 -1
  121. package/dist/internal/nodes/nodesRevisions.d.ts +1 -1
  122. package/dist/internal/nodes/nodesRevisions.js.map +1 -1
  123. package/dist/internal/nodes/validations.d.ts +1 -1
  124. package/dist/internal/nodes/validations.js +1 -4
  125. package/dist/internal/nodes/validations.js.map +1 -1
  126. package/dist/internal/photos/addToAlbum.d.ts +1 -1
  127. package/dist/internal/photos/addToAlbum.js.map +1 -1
  128. package/dist/internal/photos/albumsCrypto.js.map +1 -1
  129. package/dist/internal/photos/albumsManager.js +1 -1
  130. package/dist/internal/photos/albumsManager.js.map +1 -1
  131. package/dist/internal/photos/albumsManager.test.js +3 -3
  132. package/dist/internal/photos/albumsManager.test.js.map +1 -1
  133. package/dist/internal/photos/apiService.js +1 -1
  134. package/dist/internal/photos/index.d.ts +2 -2
  135. package/dist/internal/photos/index.js +5 -5
  136. package/dist/internal/photos/index.js.map +1 -1
  137. package/dist/internal/photos/interface.d.ts +2 -2
  138. package/dist/internal/photos/nodes.d.ts +2 -2
  139. package/dist/internal/photos/nodes.js +11 -1
  140. package/dist/internal/photos/nodes.js.map +1 -1
  141. package/dist/internal/photos/nodes.test.js +17 -3
  142. package/dist/internal/photos/nodes.test.js.map +1 -1
  143. package/dist/internal/photos/photosManager.d.ts +1 -1
  144. package/dist/internal/photos/photosManager.js +1 -1
  145. package/dist/internal/photos/photosManager.js.map +1 -1
  146. package/dist/internal/photos/photosManager.test.js +1 -1
  147. package/dist/internal/photos/photosManager.test.js.map +1 -1
  148. package/dist/internal/photos/photosTransferPayloadBuilder.test.js.map +1 -1
  149. package/dist/internal/photos/timeline.test.js.map +1 -1
  150. package/dist/internal/photos/upload.d.ts +1 -1
  151. package/dist/internal/shares/apiService.d.ts +1 -1
  152. package/dist/internal/shares/cache.d.ts +1 -1
  153. package/dist/internal/shares/cryptoCache.test.js.map +1 -1
  154. package/dist/internal/shares/cryptoService.d.ts +2 -2
  155. package/dist/internal/shares/cryptoService.js +1 -1
  156. package/dist/internal/shares/cryptoService.js.map +1 -1
  157. package/dist/internal/shares/cryptoService.test.js +1 -1
  158. package/dist/internal/shares/cryptoService.test.js.map +1 -1
  159. package/dist/internal/shares/index.d.ts +2 -2
  160. package/dist/internal/shares/index.js +1 -1
  161. package/dist/internal/shares/index.js.map +1 -1
  162. package/dist/internal/shares/manager.d.ts +2 -2
  163. package/dist/internal/shares/manager.js.map +1 -1
  164. package/dist/internal/sharing/apiService.d.ts +2 -2
  165. package/dist/internal/sharing/cryptoService.d.ts +2 -3
  166. package/dist/internal/sharing/cryptoService.js +14 -34
  167. package/dist/internal/sharing/cryptoService.js.map +1 -1
  168. package/dist/internal/sharing/cryptoService.test.js +3 -3
  169. package/dist/internal/sharing/cryptoService.test.js.map +1 -1
  170. package/dist/internal/sharing/index.d.ts +3 -3
  171. package/dist/internal/sharing/index.js +1 -1
  172. package/dist/internal/sharing/index.js.map +1 -1
  173. package/dist/internal/sharing/interface.d.ts +2 -2
  174. package/dist/internal/sharing/sharingAccess.d.ts +1 -1
  175. package/dist/internal/sharing/sharingAccess.js +1 -1
  176. package/dist/internal/sharing/sharingAccess.js.map +1 -1
  177. package/dist/internal/sharing/sharingAccess.test.js +1 -1
  178. package/dist/internal/sharing/sharingAccess.test.js.map +1 -1
  179. package/dist/internal/sharing/sharingManagement.d.ts +3 -3
  180. package/dist/internal/sharing/sharingManagement.js +1 -1
  181. package/dist/internal/sharing/sharingManagement.js.map +1 -1
  182. package/dist/internal/sharing/sharingManagement.test.js +2 -2
  183. package/dist/internal/sharing/sharingManagement.test.js.map +1 -1
  184. package/dist/internal/sharingPublic/cryptoReporter.d.ts +1 -1
  185. package/dist/internal/sharingPublic/cryptoReporter.js +1 -1
  186. package/dist/internal/sharingPublic/cryptoReporter.js.map +1 -1
  187. package/dist/internal/sharingPublic/index.d.ts +2 -2
  188. package/dist/internal/sharingPublic/index.js +3 -3
  189. package/dist/internal/sharingPublic/index.js.map +1 -1
  190. package/dist/internal/sharingPublic/nodes.d.ts +4 -4
  191. package/dist/internal/sharingPublic/nodes.js +4 -1
  192. package/dist/internal/sharingPublic/nodes.js.map +1 -1
  193. package/dist/internal/sharingPublic/session/apiService.d.ts +1 -1
  194. package/dist/internal/sharingPublic/session/manager.d.ts +1 -1
  195. package/dist/internal/upload/apiService.d.ts +1 -1
  196. package/dist/internal/upload/apiService.js +13 -6
  197. package/dist/internal/upload/apiService.js.map +1 -1
  198. package/dist/internal/upload/cryptoService.d.ts +1 -1
  199. package/dist/internal/upload/cryptoService.js +5 -4
  200. package/dist/internal/upload/cryptoService.js.map +1 -1
  201. package/dist/internal/upload/fileUploader.test.js +1 -1
  202. package/dist/internal/upload/fileUploader.test.js.map +1 -1
  203. package/dist/internal/upload/index.d.ts +2 -2
  204. package/dist/internal/upload/index.js.map +1 -1
  205. package/dist/internal/upload/interface.d.ts +1 -1
  206. package/dist/internal/upload/manager.d.ts +1 -1
  207. package/dist/internal/upload/manager.js +1 -1
  208. package/dist/internal/upload/manager.js.map +1 -1
  209. package/dist/internal/upload/smallFileUploader.test.js +1 -1
  210. package/dist/internal/upload/smallFileUploader.test.js.map +1 -1
  211. package/dist/internal/upload/streamUploader.d.ts +3 -3
  212. package/dist/internal/upload/streamUploader.js +1 -1
  213. package/dist/internal/upload/streamUploader.js.map +1 -1
  214. package/dist/internal/upload/streamUploader.test.js +2 -2
  215. package/dist/internal/upload/streamUploader.test.js.map +1 -1
  216. package/dist/internal/upload/telemetry.d.ts +1 -1
  217. package/dist/internal/upload/telemetry.js +2 -3
  218. package/dist/internal/upload/telemetry.js.map +1 -1
  219. package/dist/internal/upload/telemetry.test.js +5 -0
  220. package/dist/internal/upload/telemetry.test.js.map +1 -1
  221. package/dist/polyfill.d.ts +1 -0
  222. package/dist/polyfill.js +4 -0
  223. package/dist/polyfill.js.map +1 -0
  224. package/dist/protonDriveClient.d.ts +1 -1
  225. package/dist/protonDriveClient.js +3 -3
  226. package/dist/protonDriveClient.js.map +1 -1
  227. package/dist/protonDrivePhotosClient.d.ts +7 -1
  228. package/dist/protonDrivePhotosClient.js +13 -4
  229. package/dist/protonDrivePhotosClient.js.map +1 -1
  230. package/dist/protonDrivePublicLinkClient.d.ts +3 -3
  231. package/dist/protonDrivePublicLinkClient.js +3 -3
  232. package/dist/protonDrivePublicLinkClient.js.map +1 -1
  233. package/dist/transformers.d.ts +1 -1
  234. package/package.json +8 -4
  235. package/src/cache/index.ts +1 -1
  236. package/src/cache/memoryCache.ts +1 -1
  237. package/src/cache/nullCache.ts +1 -1
  238. package/src/crypto/driveCrypto.test.ts +1 -24
  239. package/src/crypto/driveCrypto.ts +39 -36
  240. package/src/crypto/index.ts +2 -4
  241. package/src/crypto/interface.ts +3 -49
  242. package/src/crypto/openPGPCrypto.ts +4 -88
  243. package/src/diagnostic/index.ts +3 -3
  244. package/src/diagnostic/integrityVerificationStream.ts +1 -2
  245. package/src/diagnostic/interface.ts +1 -1
  246. package/src/diagnostic/nodeUtils.ts +1 -1
  247. package/src/diagnostic/sdkDiagnosticBase.ts +6 -6
  248. package/src/diagnostic/sdkDiagnosticMain.ts +2 -2
  249. package/src/diagnostic/sdkDiagnosticPhotos.ts +2 -2
  250. package/src/diagnostic/telemetry.ts +1 -1
  251. package/src/index.ts +4 -3
  252. package/src/interface/account.ts +1 -1
  253. package/src/interface/devices.ts +1 -1
  254. package/src/interface/index.ts +40 -40
  255. package/src/interface/nodes.ts +1 -1
  256. package/src/interface/photos.ts +1 -1
  257. package/src/interface/sharing.ts +2 -2
  258. package/src/internal/apiService/apiService.test.ts +2 -2
  259. package/src/internal/apiService/apiService.ts +3 -3
  260. package/src/internal/apiService/coreTypes.ts +8641 -7349
  261. package/src/internal/apiService/driveTypes.ts +47 -92
  262. package/src/internal/apiService/errors.test.ts +2 -2
  263. package/src/internal/apiService/index.ts +4 -4
  264. package/src/internal/apiService/transformers.ts +1 -1
  265. package/src/internal/devices/index.ts +1 -1
  266. package/src/internal/devices/manager.test.ts +2 -2
  267. package/src/internal/download/cryptoService.ts +6 -11
  268. package/src/internal/download/fileDownloader.test.ts +3 -3
  269. package/src/internal/download/fileDownloader.ts +8 -6
  270. package/src/internal/download/index.ts +3 -3
  271. package/src/internal/download/interface.ts +1 -1
  272. package/src/internal/download/seekableStream.test.ts +1 -1
  273. package/src/internal/download/telemetry.test.ts +7 -1
  274. package/src/internal/download/telemetry.ts +4 -7
  275. package/src/internal/download/thumbnailDownloader.test.ts +1 -1
  276. package/src/internal/download/thumbnailDownloader.ts +2 -2
  277. package/src/internal/errors.ts +15 -0
  278. package/src/internal/events/apiService.ts +2 -2
  279. package/src/internal/events/coreEventManager.test.ts +1 -1
  280. package/src/internal/events/eventManager.ts +2 -1
  281. package/src/internal/events/index.ts +2 -2
  282. package/src/internal/events/interface.ts +8 -0
  283. package/src/internal/events/volumeEventManager.test.ts +1 -1
  284. package/src/internal/events/volumeEventManager.ts +1 -1
  285. package/src/internal/nodes/apiService.test.ts +8 -3
  286. package/src/internal/nodes/apiService.ts +22 -7
  287. package/src/internal/nodes/cache.test.ts +1 -1
  288. package/src/internal/nodes/cache.ts +1 -1
  289. package/src/internal/nodes/cryptoCache.test.ts +1 -1
  290. package/src/internal/nodes/cryptoCache.ts +1 -1
  291. package/src/internal/nodes/cryptoReporter.ts +4 -4
  292. package/src/internal/nodes/cryptoService.test.ts +2 -2
  293. package/src/internal/nodes/cryptoService.ts +14 -15
  294. package/src/internal/nodes/events.test.ts +1 -1
  295. package/src/internal/nodes/extendedAttributes.test.ts +3 -3
  296. package/src/internal/nodes/index.test.ts +8 -8
  297. package/src/internal/nodes/index.ts +6 -6
  298. package/src/internal/nodes/interface.ts +6 -6
  299. package/src/internal/nodes/nodeName.test.ts +1 -1
  300. package/src/internal/nodes/nodesAccess.test.ts +5 -5
  301. package/src/internal/nodes/nodesAccess.ts +6 -6
  302. package/src/internal/nodes/nodesManagement.test.ts +5 -5
  303. package/src/internal/nodes/nodesManagement.ts +8 -8
  304. package/src/internal/nodes/nodesRevisions.ts +1 -1
  305. package/src/internal/nodes/validations.ts +1 -4
  306. package/src/internal/photos/addToAlbum.ts +1 -1
  307. package/src/internal/photos/albumsCrypto.ts +1 -0
  308. package/src/internal/photos/albumsManager.test.ts +4 -4
  309. package/src/internal/photos/albumsManager.ts +1 -1
  310. package/src/internal/photos/apiService.ts +1 -1
  311. package/src/internal/photos/index.ts +7 -7
  312. package/src/internal/photos/interface.ts +2 -2
  313. package/src/internal/photos/nodes.test.ts +22 -6
  314. package/src/internal/photos/nodes.ts +16 -9
  315. package/src/internal/photos/photosManager.test.ts +5 -5
  316. package/src/internal/photos/photosManager.ts +4 -4
  317. package/src/internal/photos/photosTransferPayloadBuilder.test.ts +1 -1
  318. package/src/internal/photos/timeline.test.ts +1 -1
  319. package/src/internal/photos/upload.ts +3 -3
  320. package/src/internal/sdkEvents.ts +1 -1
  321. package/src/internal/shares/apiService.ts +1 -1
  322. package/src/internal/shares/cache.ts +1 -1
  323. package/src/internal/shares/cryptoCache.test.ts +1 -1
  324. package/src/internal/shares/cryptoService.test.ts +1 -1
  325. package/src/internal/shares/cryptoService.ts +8 -8
  326. package/src/internal/shares/index.ts +5 -5
  327. package/src/internal/shares/manager.ts +2 -2
  328. package/src/internal/sharing/apiService.ts +10 -10
  329. package/src/internal/sharing/cryptoService.test.ts +4 -4
  330. package/src/internal/sharing/cryptoService.ts +16 -40
  331. package/src/internal/sharing/events.test.ts +2 -2
  332. package/src/internal/sharing/index.ts +3 -3
  333. package/src/internal/sharing/interface.ts +2 -2
  334. package/src/internal/sharing/sharingAccess.test.ts +4 -4
  335. package/src/internal/sharing/sharingAccess.ts +3 -3
  336. package/src/internal/sharing/sharingManagement.test.ts +4 -4
  337. package/src/internal/sharing/sharingManagement.ts +9 -9
  338. package/src/internal/sharingPublic/cryptoReporter.ts +7 -7
  339. package/src/internal/sharingPublic/index.ts +6 -6
  340. package/src/internal/sharingPublic/nodes.ts +7 -4
  341. package/src/internal/sharingPublic/session/apiService.ts +1 -1
  342. package/src/internal/sharingPublic/session/manager.ts +1 -1
  343. package/src/internal/upload/apiService.ts +17 -8
  344. package/src/internal/upload/cryptoService.ts +8 -6
  345. package/src/internal/upload/fileUploader.test.ts +4 -4
  346. package/src/internal/upload/index.ts +3 -3
  347. package/src/internal/upload/interface.ts +1 -2
  348. package/src/internal/upload/manager.ts +4 -4
  349. package/src/internal/upload/smallFileUploader.test.ts +4 -4
  350. package/src/internal/upload/streamUploader.test.ts +5 -5
  351. package/src/internal/upload/streamUploader.ts +4 -4
  352. package/src/internal/upload/telemetry.test.ts +7 -1
  353. package/src/internal/upload/telemetry.ts +5 -8
  354. package/src/polyfill.ts +1 -0
  355. package/src/protonDriveClient.ts +32 -32
  356. package/src/protonDrivePhotosClient.ts +42 -32
  357. package/src/protonDrivePublicLinkClient.ts +25 -25
  358. package/src/transformers.ts +9 -9
  359. package/dist/crypto/hmac.d.ts +0 -22
  360. package/dist/crypto/hmac.js +0 -44
  361. package/dist/crypto/hmac.js.map +0 -1
  362. package/dist/crypto/utils.d.ts +0 -2
  363. package/dist/crypto/utils.js +0 -35
  364. package/dist/crypto/utils.js.map +0 -1
  365. package/src/crypto/hmac.ts +0 -46
  366. package/src/crypto/utils.ts +0 -40
@@ -5,7 +5,7 @@ import { ValidationError } from '../../errors';
5
5
  const MAX_NODE_NAME_LENGTH = 255;
6
6
 
7
7
  /**
8
- * @throws Error if the name is empty, long, or includes slash in the name.
8
+ * @throws Error if the name is empty or long.
9
9
  */
10
10
  export function validateNodeName(name: string): void {
11
11
  if (!name) {
@@ -20,7 +20,4 @@ export function validateNodeName(name: string): void {
20
20
  ),
21
21
  );
22
22
  }
23
- if (name.includes('/')) {
24
- throw new ValidationError(c('Error').t`Name must not contain the character '/'`);
25
- }
26
23
  }
@@ -6,8 +6,8 @@ import { splitNodeUid } from '../uids';
6
6
  import { AlbumsCryptoService } from './albumsCrypto';
7
7
  import { PhotosAPIService } from './apiService';
8
8
  import { MissingRelatedPhotosError } from './errors';
9
- import { PhotoTransferPayloadBuilder, TransferEncryptedPhotoPayload } from './photosTransferPayloadBuilder';
10
9
  import { PhotosNodesAccess } from './nodes';
10
+ import { PhotoTransferPayloadBuilder, TransferEncryptedPhotoPayload } from './photosTransferPayloadBuilder';
11
11
 
12
12
  /**
13
13
  * The number of photos that are loaded in parallel to prepare the payloads.
@@ -1,4 +1,5 @@
1
1
  import { c } from 'ttag';
2
+
2
3
  import { DriveCrypto, PrivateKey, SessionKey } from '../../crypto';
3
4
  import { ValidationError } from '../../errors';
4
5
  import { InvalidNameError, Result } from '../../interface';
@@ -1,8 +1,8 @@
1
- import { NodeType } from '../../interface';
2
1
  import { ValidationError } from '../../errors';
2
+ import { NodeType } from '../../interface';
3
3
  import { getMockTelemetry } from '../../tests/telemetry';
4
- import { AlbumsManager } from './albumsManager';
5
4
  import { AlbumsCryptoService } from './albumsCrypto';
5
+ import { AlbumsManager } from './albumsManager';
6
6
  import { PhotosAPIService } from './apiService';
7
7
  import { AlbumContainsPhotosNotInTimelineError } from './errors';
8
8
  import { DecryptedPhotoNode } from './interface';
@@ -152,7 +152,7 @@ describe('Albums', () => {
152
152
  });
153
153
 
154
154
  it('throws validation error for invalid album name', async () => {
155
- await expect(albums.createAlbum('invalid/name')).rejects.toThrow(ValidationError);
155
+ await expect(albums.createAlbum('')).rejects.toThrow(ValidationError);
156
156
  });
157
157
 
158
158
  it('throws error when parent hash key is not available', async () => {
@@ -228,7 +228,7 @@ describe('Albums', () => {
228
228
  });
229
229
 
230
230
  it('throws validation error for invalid album name', async () => {
231
- await expect(albums.updateAlbum('albumNodeUid', { name: 'invalid/name' })).rejects.toThrow(ValidationError);
231
+ await expect(albums.updateAlbum('albumNodeUid', { name: '' })).rejects.toThrow(ValidationError);
232
232
  });
233
233
  });
234
234
 
@@ -133,7 +133,7 @@ export class AlbumsManager {
133
133
  coverPhotoNodeUid?: string;
134
134
  },
135
135
  ): Promise<DecryptedPhotoNode> {
136
- if (updates.name) {
136
+ if (updates.name !== undefined) {
137
137
  validateNodeName(updates.name);
138
138
  }
139
139
 
@@ -494,7 +494,7 @@ export class PhotosAPIService {
494
494
  ): AsyncGenerator<NodeResultWithError> {
495
495
  const { volumeId, nodeId: albumLinkId } = splitNodeUid(albumNodeUid);
496
496
 
497
- const batchSize = 50;
497
+ const batchSize = 10;
498
498
 
499
499
  for (const photoNodeUidsBatch of batch(photoNodeUids, batchSize)) {
500
500
  const linkIds = photoNodeUidsBatch.map((nodeUid) => splitNodeUid(nodeUid).nodeId);
@@ -7,9 +7,9 @@ import {
7
7
  ProtonDriveTelemetry,
8
8
  } from '../../interface';
9
9
  import { DriveAPIService } from '../apiService';
10
- import { NodesCryptoService } from '../nodes/cryptoService';
11
- import { NodesCryptoReporter } from '../nodes/cryptoReporter';
12
10
  import { NodesCryptoCache } from '../nodes/cryptoCache';
11
+ import { NodesCryptoReporter } from '../nodes/cryptoReporter';
12
+ import { NodesCryptoService } from '../nodes/cryptoService';
13
13
  import { NodesEventsHandler } from '../nodes/events';
14
14
  import { NodesRevisons } from '../nodes/nodesRevisions';
15
15
  import { ShareTargetType } from '../shares';
@@ -17,16 +17,16 @@ import { SharesCache } from '../shares/cache';
17
17
  import { SharesCryptoCache } from '../shares/cryptoCache';
18
18
  import { SharesCryptoService } from '../shares/cryptoService';
19
19
  import { NodesService as UploadNodesService } from '../upload/interface';
20
- import { UploadTelemetry } from '../upload/telemetry';
21
20
  import { UploadQueue } from '../upload/queue';
22
- import { AlbumsManager } from './albumsManager';
21
+ import { UploadTelemetry } from '../upload/telemetry';
23
22
  import { AlbumsCryptoService } from './albumsCrypto';
23
+ import { AlbumsManager } from './albumsManager';
24
24
  import { PhotosAPIService } from './apiService';
25
25
  import { SharesService } from './interface';
26
- import { PhotosNodesAPIService, PhotosNodesAccess, PhotosNodesCache, PhotosNodesManagement } from './nodes';
26
+ import { PhotosNodesAccess, PhotosNodesAPIService, PhotosNodesCache, PhotosNodesManagement } from './nodes';
27
+ import { PhotosManager } from './photosManager';
27
28
  import { PhotoSharesManager } from './shares';
28
29
  import { PhotosTimeline } from './timeline';
29
- import { PhotosManager } from './photosManager';
30
30
  import {
31
31
  PhotoFileUploader,
32
32
  PhotoUploadAPIService,
@@ -35,7 +35,7 @@ import {
35
35
  PhotoUploadMetadata,
36
36
  } from './upload';
37
37
 
38
- export type { DecryptedPhotoNode, TimelineItem, AlbumItem } from './interface';
38
+ export type { AlbumItem, DecryptedPhotoNode, TimelineItem } from './interface';
39
39
 
40
40
  // Only photos and albums can be shared in photos volume.
41
41
  export const PHOTOS_SHARE_TARGET_TYPES = [ShareTargetType.Photo, ShareTargetType.Album];
@@ -1,6 +1,6 @@
1
1
  import { PrivateKey } from '../../crypto';
2
- import { MetricVolumeType, PhotoAttributes, AlbumAttributes, PhotoTag } from '../../interface';
3
- import { DecryptedNode, EncryptedNode, DecryptedUnparsedNode } from '../nodes/interface';
2
+ import { AlbumAttributes, MetricVolumeType, PhotoAttributes, PhotoTag } from '../../interface';
3
+ import { DecryptedNode, DecryptedUnparsedNode, EncryptedNode } from '../nodes/interface';
4
4
  import { EncryptedShare } from '../shares';
5
5
 
6
6
  export interface SharesService {
@@ -1,10 +1,10 @@
1
1
  import { MemoryCache } from '../../cache';
2
- import { NodeType, MemberRole } from '../../interface';
2
+ import { MemberRole, NodeType } from '../../interface';
3
3
  import { getMockLogger } from '../../tests/logger';
4
4
  import { getMockTelemetry } from '../../tests/telemetry';
5
5
  import { DriveAPIService } from '../apiService';
6
6
  import { DecryptedPhotoNode } from './interface';
7
- import { PhotosNodesAPIService, PhotosNodesCache, PhotosNodesAccess, PhotosNodesCryptoService } from './nodes';
7
+ import { PhotosNodesAccess, PhotosNodesAPIService, PhotosNodesCache, PhotosNodesCryptoService } from './nodes';
8
8
 
9
9
  function generateAPINode() {
10
10
  return {
@@ -55,7 +55,7 @@ function generateAPIAlbumNode(linkOverrides = {}, overrides = {}) {
55
55
  };
56
56
  }
57
57
 
58
- function generateAPIPhotoNode(linkOverrides = {}, overrides = {}) {
58
+ function generateAPIPhotoNode(linkOverrides = {}, photoOverrides = {}, overrides = {}) {
59
59
  const node = generateAPINode();
60
60
  return {
61
61
  ...node,
@@ -84,6 +84,7 @@ function generateAPIPhotoNode(linkOverrides = {}, overrides = {}) {
84
84
  MediaType: 'image/jpeg',
85
85
  ContentKeyPacket: 'contentKeyPacket',
86
86
  ContentKeyPacketSignature: 'contentKeyPacketSig',
87
+ ...photoOverrides,
87
88
  },
88
89
  Folder: null,
89
90
  ...overrides,
@@ -103,12 +104,16 @@ describe('PhotosNodesAPIService', () => {
103
104
  });
104
105
 
105
106
  describe('linkToEncryptedNode', () => {
106
- async function testIterateNodes(mockedLink: object, expectedType: NodeType) {
107
+ async function testIterateNodes(mockedLink: object, expectedType?: NodeType) {
107
108
  apiMock.post = jest.fn().mockResolvedValue({ Links: [mockedLink] });
108
109
 
109
110
  const nodes = await Array.fromAsync(api.iterateNodes(['volumeId~nodeId'], 'volumeId'));
110
- expect(nodes).toHaveLength(1);
111
- expect(nodes[0].type).toBe(expectedType);
111
+ if (expectedType) {
112
+ expect(nodes).toHaveLength(1);
113
+ expect(nodes[0].type).toBe(expectedType);
114
+ } else {
115
+ expect(nodes).toHaveLength(0);
116
+ }
112
117
 
113
118
  return nodes;
114
119
  }
@@ -136,6 +141,17 @@ describe('PhotosNodesAPIService', () => {
136
141
  expect(nodes[0].photo?.albums[0].nodeUid).toBe('volumeId~albumLinkId1');
137
142
  expect(nodes[0].photo?.albums[0].additionTime).toEqual(new Date(1700001000 * 1000));
138
143
  });
144
+
145
+ it('should handle photo node with null capture time', async () => {
146
+ await testIterateNodes(generateAPIPhotoNode({}, { CaptureTime: null }), undefined);
147
+ });
148
+
149
+ it('should handle photo node with capture time set to zero', async () => {
150
+ const nodes = await testIterateNodes(generateAPIPhotoNode({}, { CaptureTime: 0 }), NodeType.Photo);
151
+
152
+ expect(nodes[0].photo).toBeDefined();
153
+ expect(nodes[0].photo?.captureTime).toEqual(new Date(0));
154
+ });
139
155
  });
140
156
  });
141
157
 
@@ -2,14 +2,14 @@ import { PrivateKey } from '../../crypto';
2
2
  import { DecryptionError } from '../../errors';
3
3
  import { NodeType } from '../../interface';
4
4
  import { drivePaths } from '../apiService';
5
- import { NodeAPIServiceBase, linkToEncryptedNode, linkToEncryptedNodeBaseMetadata } from '../nodes/apiService';
6
- import { NodesCacheBase, serialiseNode, deserialiseNode } from '../nodes/cache';
5
+ import { linkToEncryptedNode, linkToEncryptedNodeBaseMetadata, NodeAPIServiceBase } from '../nodes/apiService';
6
+ import { deserialiseNode, NodesCacheBase, serialiseNode } from '../nodes/cache';
7
7
  import { NodesCryptoService } from '../nodes/cryptoService';
8
8
  import { DecryptedNodeKeys } from '../nodes/interface';
9
9
  import { NodesAccessBase, parseNode as parseNodeBase } from '../nodes/nodesAccess';
10
10
  import { NodesManagementBase } from '../nodes/nodesManagement';
11
11
  import { makeNodeUid } from '../uids';
12
- import { EncryptedPhotoNode, DecryptedPhotoNode, DecryptedUnparsedPhotoNode } from './interface';
12
+ import { DecryptedPhotoNode, DecryptedUnparsedPhotoNode, EncryptedPhotoNode } from './interface';
13
13
 
14
14
  type PostLoadLinksMetadataRequest = Extract<
15
15
  drivePaths['/drive/photos/volumes/{volumeID}/links']['post']['requestBody'],
@@ -18,10 +18,7 @@ type PostLoadLinksMetadataRequest = Extract<
18
18
  type PostLoadLinksMetadataResponse =
19
19
  drivePaths['/drive/photos/volumes/{volumeID}/links']['post']['responses']['200']['content']['application/json'];
20
20
 
21
- export class PhotosNodesAPIService extends NodeAPIServiceBase<
22
- EncryptedPhotoNode,
23
- PostLoadLinksMetadataResponse['Links'][0]
24
- > {
21
+ export class PhotosNodesAPIService extends NodeAPIServiceBase<EncryptedPhotoNode, PostLoadLinksMetadataResponse['Links'][0]> {
25
22
  protected async fetchNodeMetadata(volumeId: string, linkIds: string[], signal?: AbortSignal) {
26
23
  const response = await this.apiService.post<PostLoadLinksMetadataRequest, PostLoadLinksMetadataResponse>(
27
24
  `drive/photos/volumes/${volumeId}/links`,
@@ -37,7 +34,7 @@ export class PhotosNodesAPIService extends NodeAPIServiceBase<
37
34
  volumeId: string,
38
35
  link: PostLoadLinksMetadataResponse['Links'][0],
39
36
  isOwnVolumeId: boolean,
40
- ): EncryptedPhotoNode {
37
+ ): EncryptedPhotoNode | undefined {
41
38
  const { baseNodeMetadata, baseCryptoNodeMetadata } = linkToEncryptedNodeBaseMetadata(
42
39
  this.logger,
43
40
  volumeId,
@@ -45,13 +42,23 @@ export class PhotosNodesAPIService extends NodeAPIServiceBase<
45
42
  isOwnVolumeId,
46
43
  );
47
44
 
48
- if (link.Link.Type === 2 && link.Photo && link.Photo.ActiveRevision) {
45
+ if (link.Link.Type === 2 && link.Photo) {
49
46
  const node = linkToEncryptedNode(
50
47
  this.logger,
51
48
  volumeId,
52
49
  { ...link, File: link.Photo, Folder: null },
53
50
  isOwnVolumeId,
54
51
  );
52
+ if (!node) {
53
+ return undefined;
54
+ }
55
+ // Capture time is not present only for draft nodes.
56
+ // Draft nodes are not exposed to the client and are internal to
57
+ // upload module only.
58
+ if (link.Photo.CaptureTime === null || link.Photo.CaptureTime === undefined) {
59
+ this.logger.warn(`Requested draft photo node, skipping from the result`);
60
+ return undefined;
61
+ }
55
62
  return {
56
63
  ...node,
57
64
  type: NodeType.Photo,
@@ -1,11 +1,11 @@
1
- import { resultOk, PhotoTag } from '../../interface';
1
+ import { PhotoTag, resultOk } from '../../interface';
2
2
  import { getMockLogger } from '../../tests/logger';
3
- import { PhotosManager, UpdatePhotoSettings } from './photosManager';
4
- import { PhotosAPIService } from './apiService';
5
3
  import { AlbumsCryptoService } from './albumsCrypto';
6
- import { PhotosNodesAccess } from './nodes';
7
- import { DecryptedPhotoNode } from './interface';
4
+ import { PhotosAPIService } from './apiService';
8
5
  import { MissingRelatedPhotosError } from './errors';
6
+ import { DecryptedPhotoNode } from './interface';
7
+ import { PhotosNodesAccess } from './nodes';
8
+ import { PhotosManager, UpdatePhotoSettings } from './photosManager';
9
9
 
10
10
  function createMockPhotoNode(uid: string, overrides: Partial<DecryptedPhotoNode> = {}): DecryptedPhotoNode {
11
11
  return {
@@ -3,12 +3,12 @@ import { c } from 'ttag';
3
3
  import { AbortError } from '../../errors';
4
4
  import { Logger, NodeResultWithError, PhotoTag } from '../../interface';
5
5
  import { batch } from '../batch';
6
- import { PhotosAPIService } from './apiService';
7
- import { PhotoAlreadyInTargetError, PhotoTransferPayloadBuilder, TransferEncryptedPhotoPayload } from './photosTransferPayloadBuilder';
8
- import { PhotosNodesAccess } from './nodes';
9
- import { AlbumsCryptoService } from './albumsCrypto';
10
6
  import { createBatches } from './addToAlbum';
7
+ import { AlbumsCryptoService } from './albumsCrypto';
8
+ import { PhotosAPIService } from './apiService';
11
9
  import { MissingRelatedPhotosError } from './errors';
10
+ import { PhotosNodesAccess } from './nodes';
11
+ import { PhotoAlreadyInTargetError, PhotoTransferPayloadBuilder, TransferEncryptedPhotoPayload } from './photosTransferPayloadBuilder';
12
12
 
13
13
  /**
14
14
  * The number of photos that are loaded in parallel to prepare the payloads.
@@ -2,8 +2,8 @@ import { ValidationError } from '../../errors';
2
2
  import { resultOk } from '../../interface';
3
3
  import { AlbumsCryptoService } from './albumsCrypto';
4
4
  import { DecryptedPhotoNode } from './interface';
5
- import { PhotoTransferPayloadBuilder } from './photosTransferPayloadBuilder';
6
5
  import { PhotosNodesAccess } from './nodes';
6
+ import { PhotoTransferPayloadBuilder } from './photosTransferPayloadBuilder';
7
7
 
8
8
  /**
9
9
  * Helper to create a mock photo node with minimal required properties.
@@ -1,5 +1,5 @@
1
- import { getMockLogger } from '../../tests/logger';
2
1
  import { DriveCrypto } from '../../crypto';
2
+ import { getMockLogger } from '../../tests/logger';
3
3
  import { makeNodeUid } from '../uids';
4
4
  import { PhotosAPIService } from './apiService';
5
5
  import { PhotosNodesAccess } from './nodes';
@@ -1,11 +1,11 @@
1
1
  import { DriveCrypto } from '../../crypto';
2
2
  import {
3
- ProtonDriveTelemetry,
4
- UploadMetadata,
5
- Thumbnail,
6
3
  AnonymousUser,
7
4
  FeatureFlagProvider,
8
5
  PhotoTag,
6
+ ProtonDriveTelemetry,
7
+ Thumbnail,
8
+ UploadMetadata,
9
9
  } from '../../interface';
10
10
  import { DriveAPIService, drivePaths } from '../apiService';
11
11
  import { generateFileExtendedAttributes } from '../nodes';
@@ -1,4 +1,4 @@
1
- import { ProtonDriveTelemetry, Logger, SDKEvent } from '../interface';
1
+ import { Logger, ProtonDriveTelemetry, SDKEvent } from '../interface';
2
2
 
3
3
  export class SDKEvents {
4
4
  private logger: Logger;
@@ -1,6 +1,6 @@
1
1
  import { DriveAPIService, drivePaths } from '../apiService';
2
2
  import { makeMemberUid } from '../uids';
3
- import { EncryptedShare, EncryptedRootShare, EncryptedShareCrypto, ShareType } from './interface';
3
+ import { EncryptedRootShare, EncryptedShare, EncryptedShareCrypto, ShareType } from './interface';
4
4
 
5
5
  type PostCreateVolumeRequest = Extract<
6
6
  drivePaths['/drive/volumes']['post']['requestBody'],
@@ -1,4 +1,4 @@
1
- import { ProtonDriveEntitiesCache, Logger } from '../../interface';
1
+ import { Logger, ProtonDriveEntitiesCache } from '../../interface';
2
2
  import { getErrorMessage } from '../errors';
3
3
  import { Volume } from './interface';
4
4
 
@@ -1,5 +1,5 @@
1
- import { PrivateKey, SessionKey } from '../../crypto';
2
1
  import { MemoryCache } from '../../cache';
2
+ import { PrivateKey, SessionKey } from '../../crypto';
3
3
  import { CachedCryptoMaterial } from '../../interface';
4
4
  import { getMockLogger } from '../../tests/logger';
5
5
  import { SharesCryptoCache } from './cryptoCache';
@@ -1,8 +1,8 @@
1
1
  import { DriveCrypto, PrivateKey, SessionKey, VERIFICATION_STATUS } from '../../crypto';
2
2
  import { ProtonDriveAccount, ProtonDriveTelemetry } from '../../interface';
3
3
  import { getMockTelemetry } from '../../tests/telemetry';
4
- import { EncryptedRootShare, ShareType } from './interface';
5
4
  import { SharesCryptoService } from './cryptoService';
5
+ import { EncryptedRootShare, ShareType } from './interface';
6
6
 
7
7
  describe('SharesCryptoService', () => {
8
8
  let telemetry: ProtonDriveTelemetry;
@@ -1,20 +1,20 @@
1
+ import { DriveCrypto, PrivateKey, VERIFICATION_STATUS } from '../../crypto';
1
2
  import {
3
+ Logger,
4
+ MetricVolumeType,
2
5
  ProtonDriveAccount,
3
- resultOk,
4
- resultError,
6
+ ProtonDriveTelemetry,
5
7
  Result,
8
+ resultError,
9
+ resultOk,
6
10
  UnverifiedAuthorError,
7
- ProtonDriveTelemetry,
8
- Logger,
9
- MetricVolumeType,
10
11
  } from '../../interface';
11
- import { DriveCrypto, PrivateKey, VERIFICATION_STATUS } from '../../crypto';
12
12
  import { getVerificationMessage, isNotApplicationError } from '../errors';
13
13
  import {
14
- EncryptedRootShare,
15
14
  DecryptedRootShare,
16
- EncryptedShareCrypto,
17
15
  DecryptedShareKey,
16
+ EncryptedRootShare,
17
+ EncryptedShareCrypto,
18
18
  ShareType,
19
19
  } from './interface';
20
20
 
@@ -1,19 +1,19 @@
1
+ import { DriveCrypto } from '../../crypto';
1
2
  import {
2
- ProtonDriveEntitiesCache,
3
- ProtonDriveCryptoCache,
4
3
  ProtonDriveAccount,
4
+ ProtonDriveCryptoCache,
5
+ ProtonDriveEntitiesCache,
5
6
  ProtonDriveTelemetry,
6
7
  } from '../../interface';
7
- import { DriveCrypto } from '../../crypto';
8
8
  import { DriveAPIService } from '../apiService';
9
9
  import { SharesAPIService } from './apiService';
10
- import { SharesCryptoCache } from './cryptoCache';
11
10
  import { SharesCache } from './cache';
11
+ import { SharesCryptoCache } from './cryptoCache';
12
12
  import { SharesCryptoService } from './cryptoService';
13
13
  import { SharesManager } from './manager';
14
14
 
15
- export { ShareTargetType } from './interface';
16
15
  export type { EncryptedShare } from './interface';
16
+ export { ShareTargetType } from './interface';
17
17
 
18
18
  /**
19
19
  * Provides facade for the whole shares module.
@@ -1,11 +1,11 @@
1
- import { Logger, MetricVolumeType, ProtonDriveAccount } from '../../interface';
2
1
  import { PrivateKey } from '../../crypto';
2
+ import { Logger, MetricVolumeType, ProtonDriveAccount } from '../../interface';
3
3
  import { NotFoundAPIError } from '../apiService';
4
4
  import { SharesAPIService } from './apiService';
5
5
  import { SharesCache } from './cache';
6
6
  import { SharesCryptoCache } from './cryptoCache';
7
7
  import { SharesCryptoService } from './cryptoService';
8
- import { VolumeShareNodeIDs, EncryptedShare, EncryptedRootShare } from './interface';
8
+ import { EncryptedRootShare, EncryptedShare, VolumeShareNodeIDs } from './interface';
9
9
 
10
10
  /**
11
11
  * Provides high-level actions for managing shares.
@@ -1,31 +1,31 @@
1
1
  import { SRPVerifier } from '../../crypto';
2
- import { MemberRole, NonProtonInvitationState, Logger } from '../../interface';
2
+ import { Logger, MemberRole, NonProtonInvitationState } from '../../interface';
3
3
  import {
4
4
  DriveAPIService,
5
5
  drivePaths,
6
+ memberRoleToPermission,
6
7
  nodeTypeNumberToNodeType,
7
8
  permissionsToMemberRole,
8
- memberRoleToPermission,
9
9
  } from '../apiService';
10
10
  import { ShareTargetType } from '../shares';
11
11
  import {
12
- makeNodeUid,
13
- splitNodeUid,
14
12
  makeInvitationUid,
15
- splitInvitationUid,
16
13
  makeMemberUid,
17
- splitMemberUid,
14
+ makeNodeUid,
18
15
  makePublicLinkUid,
16
+ splitInvitationUid,
17
+ splitMemberUid,
18
+ splitNodeUid,
19
19
  splitPublicLinkUid,
20
20
  } from '../uids';
21
21
  import {
22
- EncryptedInvitationRequest,
22
+ EncryptedBookmark,
23
+ EncryptedExternalInvitation,
24
+ EncryptedExternalInvitationRequest,
23
25
  EncryptedInvitation,
26
+ EncryptedInvitationRequest,
24
27
  EncryptedInvitationWithNode,
25
- EncryptedExternalInvitation,
26
28
  EncryptedMember,
27
- EncryptedBookmark,
28
- EncryptedExternalInvitationRequest,
29
29
  EncryptedPublicLink,
30
30
  EncryptedPublicLinkCrypto,
31
31
  } from './interface';
@@ -8,8 +8,8 @@ import {
8
8
  resultOk,
9
9
  } from '../../interface';
10
10
  import { getMockTelemetry } from '../../tests/telemetry';
11
- import { SharesService } from './interface';
12
11
  import { PUBLIC_LINK_GENERATED_PASSWORD_LENGTH, SharingCryptoService } from './cryptoService';
12
+ import { SharesService } from './interface';
13
13
 
14
14
  describe('SharingCryptoService', () => {
15
15
  let telemetry: ProtonDriveTelemetry;
@@ -169,7 +169,7 @@ describe('SharingCryptoService', () => {
169
169
 
170
170
  it('should handle invalid node name', async () => {
171
171
  driveCrypto.decryptNodeName = jest.fn().mockResolvedValue({
172
- name: 'invalid/name',
172
+ name: '',
173
173
  });
174
174
 
175
175
  const result = await cryptoService.decryptBookmark(encryptedBookmark);
@@ -177,8 +177,8 @@ describe('SharingCryptoService', () => {
177
177
  expect(result).toMatchObject({
178
178
  url: resultOk('https://drive.proton.me/urls/tokenId#urlPassword'),
179
179
  nodeName: resultError({
180
- name: 'invalid/name',
181
- error: "Name must not contain the character '/'",
180
+ name: '',
181
+ error: "Name must not be empty",
182
182
  }),
183
183
  });
184
184
  });
@@ -1,4 +1,3 @@
1
- import bcrypt from 'bcryptjs';
2
1
  import { c } from 'ttag';
3
2
 
4
3
  import {
@@ -6,42 +5,37 @@ import {
6
5
  PrivateKey,
7
6
  SessionKey,
8
7
  SRPVerifier,
9
- uint8ArrayToBase64String,
10
8
  VERIFICATION_STATUS,
11
9
  } from '../../crypto';
10
+ import { DecryptionError } from '../../errors';
12
11
  import {
12
+ Author,
13
+ InvalidNameError,
14
+ Member,
15
+ MetricVolumeType,
16
+ NonProtonInvitation,
13
17
  ProtonDriveAccount,
18
+ ProtonDriveTelemetry,
14
19
  ProtonInvitation,
15
20
  ProtonInvitationWithNode,
16
- NonProtonInvitation,
17
- Author,
18
21
  Result,
19
- Member,
20
- UnverifiedAuthorError,
21
22
  resultError,
22
23
  resultOk,
23
- InvalidNameError,
24
- ProtonDriveTelemetry,
25
- MetricVolumeType,
24
+ UnverifiedAuthorError,
26
25
  } from '../../interface';
27
- import { validateNodeName } from '../nodes/validations';
28
26
  import { getErrorMessage, getVerificationMessage } from '../errors';
27
+ import { validateNodeName } from '../nodes/validations';
29
28
  import { EncryptedShare } from '../shares';
30
29
  import {
30
+ EncryptedBookmark,
31
+ EncryptedExternalInvitation,
31
32
  EncryptedInvitation,
32
33
  EncryptedInvitationWithNode,
33
- EncryptedExternalInvitation,
34
34
  EncryptedMember,
35
35
  EncryptedPublicLink,
36
36
  PublicLinkWithCreatorEmail,
37
- EncryptedBookmark,
38
37
  SharesService,
39
38
  } from './interface';
40
- import { DecryptionError } from '../../errors';
41
-
42
- // Version 2 of bcrypt with 2**10 rounds.
43
- // https://en.wikipedia.org/wiki/Bcrypt#Description
44
- const BCRYPT_PREFIX = '$2y$10$';
45
39
 
46
40
  export const PUBLIC_LINK_GENERATED_PASSWORD_LENGTH = 12;
47
41
 
@@ -199,12 +193,12 @@ export class SharingCryptoService {
199
193
  encryptedInvitation: EncryptedInvitationWithNode,
200
194
  ): Promise<ProtonInvitationWithNode> {
201
195
  const inviteeAddress = await this.account.getOwnAddress(encryptedInvitation.inviteeEmail);
202
- const inviteeKey = inviteeAddress.keys[inviteeAddress.primaryKeyIndex].key;
196
+ const inviteeKeys = inviteeAddress.keys.map(k => k.key);
203
197
 
204
198
  const shareKey = await this.driveCrypto.decryptUnsignedKey(
205
199
  encryptedInvitation.share.armoredKey,
206
200
  encryptedInvitation.share.armoredPassphrase,
207
- inviteeKey,
201
+ inviteeKeys,
208
202
  );
209
203
 
210
204
  let nodeName: Result<string, Error>;
@@ -252,7 +246,8 @@ export class SharingCryptoService {
252
246
  }> {
253
247
  const inviteeAddress = await this.account.getOwnAddress(encryptedInvitation.inviteeEmail);
254
248
  const inviteeKey = inviteeAddress.keys[inviteeAddress.primaryKeyIndex].key;
255
- const result = await this.driveCrypto.acceptInvitation(encryptedInvitation.base64KeyPacket, inviteeKey);
249
+ const inviteeKeys = inviteeAddress.keys.map(k => k.key);
250
+ const result = await this.driveCrypto.acceptInvitation(encryptedInvitation.base64KeyPacket, inviteeKeys, inviteeKey);
256
251
  return result;
257
252
  }
258
253
 
@@ -325,13 +320,10 @@ export class SharingCryptoService {
325
320
  const address = await this.account.getOwnAddress(creatorEmail);
326
321
  const addressKey = address.keys[address.primaryKeyIndex].key;
327
322
 
328
- const { base64Salt: base64SharePasswordSalt, bcryptPassphrase } =
329
- await this.computeKeySaltAndPassphrase(password);
330
- const { base64SharePassphraseKeyPacket, armoredPassword, srp } =
323
+ const { base64SharePasswordSalt, base64SharePassphraseKeyPacket, armoredPassword, srp } =
331
324
  await this.driveCrypto.encryptPublicLinkPasswordAndSessionKey(
332
325
  password,
333
326
  addressKey,
334
- bcryptPassphrase,
335
327
  shareSessionKey,
336
328
  );
337
329
 
@@ -357,22 +349,6 @@ export class SharingCryptoService {
357
349
  return result;
358
350
  }
359
351
 
360
- private async computeKeySaltAndPassphrase(password: string) {
361
- if (!password) {
362
- throw new Error('Password required.');
363
- }
364
-
365
- const salt = crypto.getRandomValues(new Uint8Array(16));
366
- const hash: string = await bcrypt.hash(password, BCRYPT_PREFIX + bcrypt.encodeBase64(salt, 16));
367
- // Remove bcrypt prefix and salt (first 29 characters)
368
- const bcryptPassphrase = hash.slice(29);
369
-
370
- return {
371
- base64Salt: uint8ArrayToBase64String(salt),
372
- bcryptPassphrase,
373
- };
374
- }
375
-
376
352
  async decryptPublicLink(encryptedPublicLink: EncryptedPublicLink): Promise<PublicLinkWithCreatorEmail> {
377
353
  const address = await this.account.getOwnAddress(encryptedPublicLink.creatorEmail);
378
354
  const addressKeys = address.keys.map(({ key }) => key);