@protontech/drive-sdk 0.14.9 → 0.15.0

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 (361) 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 +7 -11
  6. package/dist/crypto/driveCrypto.js +35 -38
  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 +2 -2
  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 +2 -2
  118. package/dist/internal/nodes/nodesManagement.js.map +1 -1
  119. package/dist/internal/nodes/nodesManagement.test.js +6 -6
  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/photos/addToAlbum.d.ts +1 -1
  124. package/dist/internal/photos/addToAlbum.js.map +1 -1
  125. package/dist/internal/photos/albumsCrypto.js.map +1 -1
  126. package/dist/internal/photos/albumsManager.js +15 -5
  127. package/dist/internal/photos/albumsManager.js.map +1 -1
  128. package/dist/internal/photos/albumsManager.test.js +3 -2
  129. package/dist/internal/photos/albumsManager.test.js.map +1 -1
  130. package/dist/internal/photos/apiService.js +1 -1
  131. package/dist/internal/photos/index.d.ts +2 -2
  132. package/dist/internal/photos/index.js +5 -5
  133. package/dist/internal/photos/index.js.map +1 -1
  134. package/dist/internal/photos/interface.d.ts +2 -2
  135. package/dist/internal/photos/nodes.d.ts +2 -2
  136. package/dist/internal/photos/nodes.js +11 -1
  137. package/dist/internal/photos/nodes.js.map +1 -1
  138. package/dist/internal/photos/nodes.test.js +17 -3
  139. package/dist/internal/photos/nodes.test.js.map +1 -1
  140. package/dist/internal/photos/photosManager.d.ts +1 -1
  141. package/dist/internal/photos/photosManager.js +1 -1
  142. package/dist/internal/photos/photosManager.js.map +1 -1
  143. package/dist/internal/photos/photosManager.test.js +1 -1
  144. package/dist/internal/photos/photosManager.test.js.map +1 -1
  145. package/dist/internal/photos/photosTransferPayloadBuilder.test.js.map +1 -1
  146. package/dist/internal/photos/timeline.test.js.map +1 -1
  147. package/dist/internal/photos/upload.d.ts +1 -1
  148. package/dist/internal/shares/apiService.d.ts +1 -1
  149. package/dist/internal/shares/cache.d.ts +1 -1
  150. package/dist/internal/shares/cryptoCache.test.js.map +1 -1
  151. package/dist/internal/shares/cryptoService.d.ts +2 -2
  152. package/dist/internal/shares/cryptoService.js +1 -1
  153. package/dist/internal/shares/cryptoService.js.map +1 -1
  154. package/dist/internal/shares/cryptoService.test.js +1 -1
  155. package/dist/internal/shares/cryptoService.test.js.map +1 -1
  156. package/dist/internal/shares/index.d.ts +2 -2
  157. package/dist/internal/shares/index.js +1 -1
  158. package/dist/internal/shares/index.js.map +1 -1
  159. package/dist/internal/shares/manager.d.ts +2 -2
  160. package/dist/internal/shares/manager.js.map +1 -1
  161. package/dist/internal/sharing/apiService.d.ts +2 -2
  162. package/dist/internal/sharing/cryptoService.d.ts +2 -3
  163. package/dist/internal/sharing/cryptoService.js +10 -31
  164. package/dist/internal/sharing/cryptoService.js.map +1 -1
  165. package/dist/internal/sharing/cryptoService.test.js.map +1 -1
  166. package/dist/internal/sharing/index.d.ts +3 -3
  167. package/dist/internal/sharing/index.js +1 -1
  168. package/dist/internal/sharing/index.js.map +1 -1
  169. package/dist/internal/sharing/interface.d.ts +2 -2
  170. package/dist/internal/sharing/sharingAccess.d.ts +1 -1
  171. package/dist/internal/sharing/sharingAccess.js +1 -1
  172. package/dist/internal/sharing/sharingAccess.js.map +1 -1
  173. package/dist/internal/sharing/sharingAccess.test.js +1 -1
  174. package/dist/internal/sharing/sharingAccess.test.js.map +1 -1
  175. package/dist/internal/sharing/sharingManagement.d.ts +3 -3
  176. package/dist/internal/sharing/sharingManagement.js +1 -1
  177. package/dist/internal/sharing/sharingManagement.js.map +1 -1
  178. package/dist/internal/sharing/sharingManagement.test.js +2 -2
  179. package/dist/internal/sharing/sharingManagement.test.js.map +1 -1
  180. package/dist/internal/sharingPublic/cryptoReporter.d.ts +1 -1
  181. package/dist/internal/sharingPublic/cryptoReporter.js +1 -1
  182. package/dist/internal/sharingPublic/cryptoReporter.js.map +1 -1
  183. package/dist/internal/sharingPublic/index.d.ts +2 -2
  184. package/dist/internal/sharingPublic/index.js +3 -3
  185. package/dist/internal/sharingPublic/index.js.map +1 -1
  186. package/dist/internal/sharingPublic/nodes.d.ts +4 -4
  187. package/dist/internal/sharingPublic/nodes.js +4 -1
  188. package/dist/internal/sharingPublic/nodes.js.map +1 -1
  189. package/dist/internal/sharingPublic/session/apiService.d.ts +1 -1
  190. package/dist/internal/sharingPublic/session/manager.d.ts +1 -1
  191. package/dist/internal/upload/apiService.d.ts +1 -1
  192. package/dist/internal/upload/apiService.js +13 -6
  193. package/dist/internal/upload/apiService.js.map +1 -1
  194. package/dist/internal/upload/cryptoService.d.ts +1 -1
  195. package/dist/internal/upload/cryptoService.js +5 -4
  196. package/dist/internal/upload/cryptoService.js.map +1 -1
  197. package/dist/internal/upload/fileUploader.test.js +1 -1
  198. package/dist/internal/upload/fileUploader.test.js.map +1 -1
  199. package/dist/internal/upload/index.d.ts +2 -2
  200. package/dist/internal/upload/index.js.map +1 -1
  201. package/dist/internal/upload/interface.d.ts +1 -1
  202. package/dist/internal/upload/manager.d.ts +1 -1
  203. package/dist/internal/upload/manager.js +1 -1
  204. package/dist/internal/upload/manager.js.map +1 -1
  205. package/dist/internal/upload/smallFileUploader.test.js +1 -1
  206. package/dist/internal/upload/smallFileUploader.test.js.map +1 -1
  207. package/dist/internal/upload/streamUploader.d.ts +3 -3
  208. package/dist/internal/upload/streamUploader.js +1 -1
  209. package/dist/internal/upload/streamUploader.js.map +1 -1
  210. package/dist/internal/upload/streamUploader.test.js +2 -2
  211. package/dist/internal/upload/streamUploader.test.js.map +1 -1
  212. package/dist/internal/upload/telemetry.d.ts +1 -1
  213. package/dist/internal/upload/telemetry.js +2 -3
  214. package/dist/internal/upload/telemetry.js.map +1 -1
  215. package/dist/internal/upload/telemetry.test.js +5 -0
  216. package/dist/internal/upload/telemetry.test.js.map +1 -1
  217. package/dist/polyfill.d.ts +1 -0
  218. package/dist/polyfill.js +4 -0
  219. package/dist/polyfill.js.map +1 -0
  220. package/dist/protonDriveClient.d.ts +1 -1
  221. package/dist/protonDriveClient.js +3 -3
  222. package/dist/protonDriveClient.js.map +1 -1
  223. package/dist/protonDrivePhotosClient.d.ts +7 -1
  224. package/dist/protonDrivePhotosClient.js +13 -4
  225. package/dist/protonDrivePhotosClient.js.map +1 -1
  226. package/dist/protonDrivePublicLinkClient.d.ts +3 -3
  227. package/dist/protonDrivePublicLinkClient.js +3 -3
  228. package/dist/protonDrivePublicLinkClient.js.map +1 -1
  229. package/dist/transformers.d.ts +1 -1
  230. package/package.json +8 -4
  231. package/src/cache/index.ts +1 -1
  232. package/src/cache/memoryCache.ts +1 -1
  233. package/src/cache/nullCache.ts +1 -1
  234. package/src/crypto/driveCrypto.test.ts +1 -24
  235. package/src/crypto/driveCrypto.ts +37 -35
  236. package/src/crypto/index.ts +2 -4
  237. package/src/crypto/interface.ts +3 -49
  238. package/src/crypto/openPGPCrypto.ts +4 -88
  239. package/src/diagnostic/index.ts +3 -3
  240. package/src/diagnostic/integrityVerificationStream.ts +1 -2
  241. package/src/diagnostic/interface.ts +1 -1
  242. package/src/diagnostic/nodeUtils.ts +1 -1
  243. package/src/diagnostic/sdkDiagnosticBase.ts +6 -6
  244. package/src/diagnostic/sdkDiagnosticMain.ts +2 -2
  245. package/src/diagnostic/sdkDiagnosticPhotos.ts +2 -2
  246. package/src/diagnostic/telemetry.ts +1 -1
  247. package/src/index.ts +4 -3
  248. package/src/interface/account.ts +1 -1
  249. package/src/interface/devices.ts +1 -1
  250. package/src/interface/index.ts +40 -40
  251. package/src/interface/nodes.ts +1 -1
  252. package/src/interface/photos.ts +1 -1
  253. package/src/interface/sharing.ts +2 -2
  254. package/src/internal/apiService/apiService.test.ts +2 -2
  255. package/src/internal/apiService/apiService.ts +3 -3
  256. package/src/internal/apiService/coreTypes.ts +8641 -7349
  257. package/src/internal/apiService/driveTypes.ts +47 -92
  258. package/src/internal/apiService/errors.test.ts +2 -2
  259. package/src/internal/apiService/index.ts +4 -4
  260. package/src/internal/apiService/transformers.ts +1 -1
  261. package/src/internal/devices/index.ts +1 -1
  262. package/src/internal/devices/manager.test.ts +2 -2
  263. package/src/internal/download/cryptoService.ts +6 -11
  264. package/src/internal/download/fileDownloader.test.ts +3 -3
  265. package/src/internal/download/fileDownloader.ts +8 -6
  266. package/src/internal/download/index.ts +3 -3
  267. package/src/internal/download/interface.ts +1 -1
  268. package/src/internal/download/seekableStream.test.ts +1 -1
  269. package/src/internal/download/telemetry.test.ts +7 -1
  270. package/src/internal/download/telemetry.ts +4 -7
  271. package/src/internal/download/thumbnailDownloader.test.ts +1 -1
  272. package/src/internal/download/thumbnailDownloader.ts +2 -2
  273. package/src/internal/errors.ts +15 -0
  274. package/src/internal/events/apiService.ts +2 -2
  275. package/src/internal/events/coreEventManager.test.ts +1 -1
  276. package/src/internal/events/eventManager.ts +2 -1
  277. package/src/internal/events/index.ts +2 -2
  278. package/src/internal/events/interface.ts +8 -0
  279. package/src/internal/events/volumeEventManager.test.ts +1 -1
  280. package/src/internal/events/volumeEventManager.ts +1 -1
  281. package/src/internal/nodes/apiService.test.ts +8 -3
  282. package/src/internal/nodes/apiService.ts +22 -7
  283. package/src/internal/nodes/cache.test.ts +1 -1
  284. package/src/internal/nodes/cache.ts +1 -1
  285. package/src/internal/nodes/cryptoCache.test.ts +1 -1
  286. package/src/internal/nodes/cryptoCache.ts +1 -1
  287. package/src/internal/nodes/cryptoReporter.ts +4 -4
  288. package/src/internal/nodes/cryptoService.test.ts +2 -2
  289. package/src/internal/nodes/cryptoService.ts +14 -15
  290. package/src/internal/nodes/events.test.ts +1 -1
  291. package/src/internal/nodes/extendedAttributes.test.ts +3 -3
  292. package/src/internal/nodes/index.test.ts +8 -8
  293. package/src/internal/nodes/index.ts +6 -6
  294. package/src/internal/nodes/interface.ts +6 -6
  295. package/src/internal/nodes/nodeName.test.ts +1 -1
  296. package/src/internal/nodes/nodesAccess.test.ts +3 -3
  297. package/src/internal/nodes/nodesAccess.ts +6 -6
  298. package/src/internal/nodes/nodesManagement.test.ts +4 -4
  299. package/src/internal/nodes/nodesManagement.ts +6 -6
  300. package/src/internal/nodes/nodesRevisions.ts +1 -1
  301. package/src/internal/photos/addToAlbum.ts +1 -1
  302. package/src/internal/photos/albumsCrypto.ts +1 -0
  303. package/src/internal/photos/albumsManager.test.ts +4 -3
  304. package/src/internal/photos/albumsManager.ts +13 -5
  305. package/src/internal/photos/apiService.ts +1 -1
  306. package/src/internal/photos/index.ts +7 -7
  307. package/src/internal/photos/interface.ts +2 -2
  308. package/src/internal/photos/nodes.test.ts +22 -6
  309. package/src/internal/photos/nodes.ts +16 -9
  310. package/src/internal/photos/photosManager.test.ts +5 -5
  311. package/src/internal/photos/photosManager.ts +4 -4
  312. package/src/internal/photos/photosTransferPayloadBuilder.test.ts +1 -1
  313. package/src/internal/photos/timeline.test.ts +1 -1
  314. package/src/internal/photos/upload.ts +3 -3
  315. package/src/internal/sdkEvents.ts +1 -1
  316. package/src/internal/shares/apiService.ts +1 -1
  317. package/src/internal/shares/cache.ts +1 -1
  318. package/src/internal/shares/cryptoCache.test.ts +1 -1
  319. package/src/internal/shares/cryptoService.test.ts +1 -1
  320. package/src/internal/shares/cryptoService.ts +8 -8
  321. package/src/internal/shares/index.ts +5 -5
  322. package/src/internal/shares/manager.ts +2 -2
  323. package/src/internal/sharing/apiService.ts +10 -10
  324. package/src/internal/sharing/cryptoService.test.ts +1 -1
  325. package/src/internal/sharing/cryptoService.ts +12 -37
  326. package/src/internal/sharing/events.test.ts +2 -2
  327. package/src/internal/sharing/index.ts +3 -3
  328. package/src/internal/sharing/interface.ts +2 -2
  329. package/src/internal/sharing/sharingAccess.test.ts +4 -4
  330. package/src/internal/sharing/sharingAccess.ts +3 -3
  331. package/src/internal/sharing/sharingManagement.test.ts +4 -4
  332. package/src/internal/sharing/sharingManagement.ts +9 -9
  333. package/src/internal/sharingPublic/cryptoReporter.ts +7 -7
  334. package/src/internal/sharingPublic/index.ts +6 -6
  335. package/src/internal/sharingPublic/nodes.ts +7 -4
  336. package/src/internal/sharingPublic/session/apiService.ts +1 -1
  337. package/src/internal/sharingPublic/session/manager.ts +1 -1
  338. package/src/internal/upload/apiService.ts +17 -8
  339. package/src/internal/upload/cryptoService.ts +8 -6
  340. package/src/internal/upload/fileUploader.test.ts +4 -4
  341. package/src/internal/upload/index.ts +3 -3
  342. package/src/internal/upload/interface.ts +1 -2
  343. package/src/internal/upload/manager.ts +4 -4
  344. package/src/internal/upload/smallFileUploader.test.ts +4 -4
  345. package/src/internal/upload/streamUploader.test.ts +5 -5
  346. package/src/internal/upload/streamUploader.ts +4 -4
  347. package/src/internal/upload/telemetry.test.ts +7 -1
  348. package/src/internal/upload/telemetry.ts +5 -8
  349. package/src/polyfill.ts +1 -0
  350. package/src/protonDriveClient.ts +32 -32
  351. package/src/protonDrivePhotosClient.ts +42 -32
  352. package/src/protonDrivePublicLinkClient.ts +25 -25
  353. package/src/transformers.ts +9 -9
  354. package/dist/crypto/hmac.d.ts +0 -22
  355. package/dist/crypto/hmac.js +0 -44
  356. package/dist/crypto/hmac.js.map +0 -1
  357. package/dist/crypto/utils.d.ts +0 -2
  358. package/dist/crypto/utils.js +0 -35
  359. package/dist/crypto/utils.js.map +0 -1
  360. package/src/crypto/hmac.ts +0 -46
  361. package/src/crypto/utils.ts +0 -40
@@ -220,7 +220,11 @@ export class AlbumsManager {
220
220
  this.logger,
221
221
  signal,
222
222
  );
223
- yield* process.execute(photoNodeUids);
223
+ try {
224
+ yield* process.execute(photoNodeUids);
225
+ } finally {
226
+ await this.nodesService.notifyNodeChanged(albumNodeUid);
227
+ }
224
228
  }
225
229
 
226
230
  async *removePhotos(
@@ -228,11 +232,15 @@ export class AlbumsManager {
228
232
  photoNodeUids: string[],
229
233
  signal?: AbortSignal,
230
234
  ): AsyncGenerator<NodeResultWithError> {
231
- for await (const result of this.apiService.removePhotosFromAlbum(albumNodeUid, photoNodeUids, signal)) {
232
- if (result.ok) {
233
- await this.nodesService.notifyNodeChanged(result.uid);
235
+ try {
236
+ for await (const result of this.apiService.removePhotosFromAlbum(albumNodeUid, photoNodeUids, signal)) {
237
+ if (result.ok) {
238
+ await this.nodesService.notifyNodeChanged(result.uid);
239
+ }
240
+ yield result;
234
241
  }
235
- yield result;
242
+ } finally {
243
+ await this.nodesService.notifyNodeChanged(albumNodeUid);
236
244
  }
237
245
  }
238
246
 
@@ -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;
@@ -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
 
@@ -325,13 +319,10 @@ export class SharingCryptoService {
325
319
  const address = await this.account.getOwnAddress(creatorEmail);
326
320
  const addressKey = address.keys[address.primaryKeyIndex].key;
327
321
 
328
- const { base64Salt: base64SharePasswordSalt, bcryptPassphrase } =
329
- await this.computeKeySaltAndPassphrase(password);
330
- const { base64SharePassphraseKeyPacket, armoredPassword, srp } =
322
+ const { base64SharePasswordSalt, base64SharePassphraseKeyPacket, armoredPassword, srp } =
331
323
  await this.driveCrypto.encryptPublicLinkPasswordAndSessionKey(
332
324
  password,
333
325
  addressKey,
334
- bcryptPassphrase,
335
326
  shareSessionKey,
336
327
  );
337
328
 
@@ -357,22 +348,6 @@ export class SharingCryptoService {
357
348
  return result;
358
349
  }
359
350
 
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
351
  async decryptPublicLink(encryptedPublicLink: EncryptedPublicLink): Promise<PublicLinkWithCreatorEmail> {
377
352
  const address = await this.account.getOwnAddress(encryptedPublicLink.creatorEmail);
378
353
  const addressKeys = address.keys.map(({ key }) => key);
@@ -1,10 +1,10 @@
1
1
  import { getMockLogger } from '../../tests/logger';
2
2
  import { DriveEvent, DriveEventType } from '../events';
3
+ import { SharesManager } from '../shares/manager';
3
4
  import { SharingCache } from './cache';
4
- import { SharingAccess } from './sharingAccess';
5
5
  import { SharingEventHandler } from './events';
6
- import { SharesManager } from '../shares/manager';
7
6
  import { NodesService } from './interface';
7
+ import { SharingAccess } from './sharingAccess';
8
8
 
9
9
  // FIXME: test tree_refresh and tree_remove
10
10
 
@@ -1,14 +1,14 @@
1
- import { ProtonDriveAccount, ProtonDriveEntitiesCache, ProtonDriveTelemetry } from '../../interface';
2
1
  import { DriveCrypto } from '../../crypto';
2
+ import { ProtonDriveAccount, ProtonDriveEntitiesCache, ProtonDriveTelemetry } from '../../interface';
3
3
  import { DriveAPIService } from '../apiService';
4
4
  import { ShareTargetType } from '../shares';
5
5
  import { SharingAPIService } from './apiService';
6
6
  import { SharingCache } from './cache';
7
7
  import { SharingCryptoService } from './cryptoService';
8
+ import { SharingEventHandler } from './events';
9
+ import { NodesService, SharesService } from './interface';
8
10
  import { SharingAccess } from './sharingAccess';
9
11
  import { SharingManagement } from './sharingManagement';
10
- import { SharesService, NodesService } from './interface';
11
- import { SharingEventHandler } from './events';
12
12
 
13
13
  // Root shares are not allowed to be shared.
14
14
  // Photos and Albums are not supported in main volume (core Drive).
@@ -1,7 +1,7 @@
1
- import { NodeType, MemberRole, NonProtonInvitationState, MissingNode, ShareResult, PublicLink } from '../../interface';
2
1
  import { PrivateKey, SessionKey } from '../../crypto';
3
- import { EncryptedShare } from '../shares';
2
+ import { MemberRole, MissingNode, NodeType, NonProtonInvitationState, PublicLink, ShareResult } from '../../interface';
4
3
  import { DecryptedNode } from '../nodes';
4
+ import { EncryptedShare } from '../shares';
5
5
 
6
6
  export enum SharingType {
7
7
  SharedByMe = 'sharedByMe',
@@ -1,11 +1,11 @@
1
- import { getMockLogger } from '../../tests/logger';
2
- import { NodeType, resultError, resultOk, MemberRole } from '../../interface';
3
1
  import { ValidationError } from '../../errors';
2
+ import { MemberRole, NodeType, resultError, resultOk } from '../../interface';
3
+ import { getMockLogger } from '../../tests/logger';
4
4
  import { SharingAPIService } from './apiService';
5
5
  import { SharingCache } from './cache';
6
6
  import { SharingCryptoService } from './cryptoService';
7
- import { SharesService, NodesService } from './interface';
8
- import { SharingAccess, BATCH_LOADING_SIZE } from './sharingAccess';
7
+ import { NodesService, SharesService } from './interface';
8
+ import { BATCH_LOADING_SIZE, SharingAccess } from './sharingAccess';
9
9
 
10
10
  describe('SharingAccess', () => {
11
11
  let apiService: SharingAPIService;
@@ -1,13 +1,13 @@
1
1
  import { c } from 'ttag';
2
2
 
3
- import { MaybeBookmark, ProtonInvitationWithNode, resultError, resultOk } from '../../interface';
4
3
  import { ValidationError } from '../../errors';
5
- import { DecryptedNode } from '../nodes';
4
+ import { MaybeBookmark, ProtonInvitationWithNode, resultError, resultOk } from '../../interface';
6
5
  import { BatchLoading } from '../batchLoading';
6
+ import { DecryptedNode } from '../nodes';
7
7
  import { SharingAPIService } from './apiService';
8
8
  import { SharingCache } from './cache';
9
9
  import { SharingCryptoService } from './cryptoService';
10
- import { SharesService, NodesService } from './interface';
10
+ import { NodesService, SharesService } from './interface';
11
11
 
12
12
  // This is the number of nodes that are loaded in parallel.
13
13
  // It is a trade-off between initial wait time and overhead of API calls.