@protontech/drive-sdk 0.0.10

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 (594) hide show
  1. package/README.md +17 -0
  2. package/dist/cache/index.d.ts +2 -0
  3. package/dist/cache/index.js +6 -0
  4. package/dist/cache/index.js.map +1 -0
  5. package/dist/cache/interface.d.ts +105 -0
  6. package/dist/cache/interface.js +3 -0
  7. package/dist/cache/interface.js.map +1 -0
  8. package/dist/cache/memoryCache.d.ts +18 -0
  9. package/dist/cache/memoryCache.js +78 -0
  10. package/dist/cache/memoryCache.js.map +1 -0
  11. package/dist/cache/memoryCache.test.d.ts +1 -0
  12. package/dist/cache/memoryCache.test.js +121 -0
  13. package/dist/cache/memoryCache.test.js.map +1 -0
  14. package/dist/config.d.ts +2 -0
  15. package/dist/config.js +11 -0
  16. package/dist/config.js.map +1 -0
  17. package/dist/crypto/driveCrypto.d.ts +209 -0
  18. package/dist/crypto/driveCrypto.js +364 -0
  19. package/dist/crypto/driveCrypto.js.map +1 -0
  20. package/dist/crypto/driveCrypto.test.d.ts +1 -0
  21. package/dist/crypto/driveCrypto.test.js +42 -0
  22. package/dist/crypto/driveCrypto.test.js.map +1 -0
  23. package/dist/crypto/hmac.d.ts +22 -0
  24. package/dist/crypto/hmac.js +44 -0
  25. package/dist/crypto/hmac.js.map +1 -0
  26. package/dist/crypto/index.d.ts +6 -0
  27. package/dist/crypto/index.js +13 -0
  28. package/dist/crypto/index.js.map +1 -0
  29. package/dist/crypto/interface.d.ts +125 -0
  30. package/dist/crypto/interface.js +10 -0
  31. package/dist/crypto/interface.js.map +1 -0
  32. package/dist/crypto/openPGPCrypto.d.ts +145 -0
  33. package/dist/crypto/openPGPCrypto.js +250 -0
  34. package/dist/crypto/openPGPCrypto.js.map +1 -0
  35. package/dist/crypto/utils.d.ts +2 -0
  36. package/dist/crypto/utils.js +35 -0
  37. package/dist/crypto/utils.js.map +1 -0
  38. package/dist/errors.d.ts +138 -0
  39. package/dist/errors.js +163 -0
  40. package/dist/errors.js.map +1 -0
  41. package/dist/index.d.ts +24 -0
  42. package/dist/index.js +48 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/interface/account.d.ts +36 -0
  45. package/dist/interface/account.js +3 -0
  46. package/dist/interface/account.js.map +1 -0
  47. package/dist/interface/author.d.ts +26 -0
  48. package/dist/interface/author.js +3 -0
  49. package/dist/interface/author.js.map +1 -0
  50. package/dist/interface/devices.d.ts +18 -0
  51. package/dist/interface/devices.js +10 -0
  52. package/dist/interface/devices.js.map +1 -0
  53. package/dist/interface/download.d.ts +29 -0
  54. package/dist/interface/download.js +3 -0
  55. package/dist/interface/download.js.map +1 -0
  56. package/dist/interface/events.d.ts +26 -0
  57. package/dist/interface/events.js +11 -0
  58. package/dist/interface/events.js.map +1 -0
  59. package/dist/interface/httpClient.d.ts +38 -0
  60. package/dist/interface/httpClient.js +3 -0
  61. package/dist/interface/httpClient.js.map +1 -0
  62. package/dist/interface/index.d.ts +43 -0
  63. package/dist/interface/index.js +22 -0
  64. package/dist/interface/index.js.map +1 -0
  65. package/dist/interface/nodes.d.ts +161 -0
  66. package/dist/interface/nodes.js +21 -0
  67. package/dist/interface/nodes.js.map +1 -0
  68. package/dist/interface/result.d.ts +9 -0
  69. package/dist/interface/result.js +11 -0
  70. package/dist/interface/result.js.map +1 -0
  71. package/dist/interface/sharing.d.ts +73 -0
  72. package/dist/interface/sharing.js +9 -0
  73. package/dist/interface/sharing.js.map +1 -0
  74. package/dist/interface/telemetry.d.ts +61 -0
  75. package/dist/interface/telemetry.js +18 -0
  76. package/dist/interface/telemetry.js.map +1 -0
  77. package/dist/interface/thumbnail.d.ts +17 -0
  78. package/dist/interface/thumbnail.js +9 -0
  79. package/dist/interface/thumbnail.js.map +1 -0
  80. package/dist/interface/upload.d.ts +16 -0
  81. package/dist/interface/upload.js +3 -0
  82. package/dist/interface/upload.js.map +1 -0
  83. package/dist/internal/apiService/apiService.d.ts +51 -0
  84. package/dist/internal/apiService/apiService.js +305 -0
  85. package/dist/internal/apiService/apiService.js.map +1 -0
  86. package/dist/internal/apiService/apiService.test.d.ts +1 -0
  87. package/dist/internal/apiService/apiService.test.js +237 -0
  88. package/dist/internal/apiService/apiService.test.js.map +1 -0
  89. package/dist/internal/apiService/coreTypes.d.ts +24438 -0
  90. package/dist/internal/apiService/coreTypes.js +7 -0
  91. package/dist/internal/apiService/coreTypes.js.map +1 -0
  92. package/dist/internal/apiService/driveTypes.d.ts +11840 -0
  93. package/dist/internal/apiService/driveTypes.js +7 -0
  94. package/dist/internal/apiService/driveTypes.js.map +1 -0
  95. package/dist/internal/apiService/errorCodes.d.ts +30 -0
  96. package/dist/internal/apiService/errorCodes.js +11 -0
  97. package/dist/internal/apiService/errorCodes.js.map +1 -0
  98. package/dist/internal/apiService/errors.d.ts +19 -0
  99. package/dist/internal/apiService/errors.js +76 -0
  100. package/dist/internal/apiService/errors.js.map +1 -0
  101. package/dist/internal/apiService/errors.test.d.ts +1 -0
  102. package/dist/internal/apiService/errors.test.js +69 -0
  103. package/dist/internal/apiService/errors.test.js.map +1 -0
  104. package/dist/internal/apiService/index.d.ts +7 -0
  105. package/dist/internal/apiService/index.js +30 -0
  106. package/dist/internal/apiService/index.js.map +1 -0
  107. package/dist/internal/apiService/observerStream.d.ts +3 -0
  108. package/dist/internal/apiService/observerStream.js +15 -0
  109. package/dist/internal/apiService/observerStream.js.map +1 -0
  110. package/dist/internal/apiService/transformers.d.ts +4 -0
  111. package/dist/internal/apiService/transformers.js +48 -0
  112. package/dist/internal/apiService/transformers.js.map +1 -0
  113. package/dist/internal/batchLoading.d.ts +34 -0
  114. package/dist/internal/batchLoading.js +68 -0
  115. package/dist/internal/batchLoading.js.map +1 -0
  116. package/dist/internal/batchLoading.test.d.ts +1 -0
  117. package/dist/internal/batchLoading.test.js +50 -0
  118. package/dist/internal/batchLoading.test.js.map +1 -0
  119. package/dist/internal/devices/apiService.d.ts +38 -0
  120. package/dist/internal/devices/apiService.js +105 -0
  121. package/dist/internal/devices/apiService.js.map +1 -0
  122. package/dist/internal/devices/cryptoService.d.ts +30 -0
  123. package/dist/internal/devices/cryptoService.js +47 -0
  124. package/dist/internal/devices/cryptoService.js.map +1 -0
  125. package/dist/internal/devices/index.d.ts +15 -0
  126. package/dist/internal/devices/index.js +22 -0
  127. package/dist/internal/devices/index.js.map +1 -0
  128. package/dist/internal/devices/interface.d.ts +31 -0
  129. package/dist/internal/devices/interface.js +3 -0
  130. package/dist/internal/devices/interface.js.map +1 -0
  131. package/dist/internal/devices/manager.d.ts +18 -0
  132. package/dist/internal/devices/manager.js +103 -0
  133. package/dist/internal/devices/manager.js.map +1 -0
  134. package/dist/internal/devices/manager.test.d.ts +1 -0
  135. package/dist/internal/devices/manager.test.js +100 -0
  136. package/dist/internal/devices/manager.test.js.map +1 -0
  137. package/dist/internal/download/apiService.d.ts +27 -0
  138. package/dist/internal/download/apiService.js +110 -0
  139. package/dist/internal/download/apiService.js.map +1 -0
  140. package/dist/internal/download/controller.d.ts +8 -0
  141. package/dist/internal/download/controller.js +22 -0
  142. package/dist/internal/download/controller.js.map +1 -0
  143. package/dist/internal/download/cryptoService.d.ts +17 -0
  144. package/dist/internal/download/cryptoService.js +82 -0
  145. package/dist/internal/download/cryptoService.js.map +1 -0
  146. package/dist/internal/download/fileDownloader.d.ts +33 -0
  147. package/dist/internal/download/fileDownloader.js +226 -0
  148. package/dist/internal/download/fileDownloader.js.map +1 -0
  149. package/dist/internal/download/fileDownloader.test.d.ts +1 -0
  150. package/dist/internal/download/fileDownloader.test.js +324 -0
  151. package/dist/internal/download/fileDownloader.test.js.map +1 -0
  152. package/dist/internal/download/index.d.ts +10 -0
  153. package/dist/internal/download/index.js +82 -0
  154. package/dist/internal/download/index.js.map +1 -0
  155. package/dist/internal/download/interface.d.ts +35 -0
  156. package/dist/internal/download/interface.js +3 -0
  157. package/dist/internal/download/interface.js.map +1 -0
  158. package/dist/internal/download/queue.d.ts +5 -0
  159. package/dist/internal/download/queue.js +31 -0
  160. package/dist/internal/download/queue.js.map +1 -0
  161. package/dist/internal/download/telemetry.d.ts +14 -0
  162. package/dist/internal/download/telemetry.js +106 -0
  163. package/dist/internal/download/telemetry.js.map +1 -0
  164. package/dist/internal/download/telemetry.test.d.ts +1 -0
  165. package/dist/internal/download/telemetry.test.js +111 -0
  166. package/dist/internal/download/telemetry.test.js.map +1 -0
  167. package/dist/internal/download/thumbnailDownloader.d.ts +19 -0
  168. package/dist/internal/download/thumbnailDownloader.js +198 -0
  169. package/dist/internal/download/thumbnailDownloader.js.map +1 -0
  170. package/dist/internal/download/thumbnailDownloader.test.d.ts +1 -0
  171. package/dist/internal/download/thumbnailDownloader.test.js +179 -0
  172. package/dist/internal/download/thumbnailDownloader.test.js.map +1 -0
  173. package/dist/internal/errors.d.ts +6 -0
  174. package/dist/internal/errors.js +28 -0
  175. package/dist/internal/errors.js.map +1 -0
  176. package/dist/internal/errors.test.d.ts +1 -0
  177. package/dist/internal/errors.test.js +22 -0
  178. package/dist/internal/errors.test.js.map +1 -0
  179. package/dist/internal/events/apiService.d.ts +18 -0
  180. package/dist/internal/events/apiService.js +81 -0
  181. package/dist/internal/events/apiService.js.map +1 -0
  182. package/dist/internal/events/cache.d.ts +28 -0
  183. package/dist/internal/events/cache.js +67 -0
  184. package/dist/internal/events/cache.js.map +1 -0
  185. package/dist/internal/events/cache.test.d.ts +1 -0
  186. package/dist/internal/events/cache.test.js +43 -0
  187. package/dist/internal/events/cache.test.js.map +1 -0
  188. package/dist/internal/events/coreEventManager.d.ts +25 -0
  189. package/dist/internal/events/coreEventManager.js +63 -0
  190. package/dist/internal/events/coreEventManager.js.map +1 -0
  191. package/dist/internal/events/eventManager.d.ts +62 -0
  192. package/dist/internal/events/eventManager.js +159 -0
  193. package/dist/internal/events/eventManager.js.map +1 -0
  194. package/dist/internal/events/eventManager.test.d.ts +1 -0
  195. package/dist/internal/events/eventManager.test.js +120 -0
  196. package/dist/internal/events/eventManager.test.js.map +1 -0
  197. package/dist/internal/events/index.d.ts +50 -0
  198. package/dist/internal/events/index.js +117 -0
  199. package/dist/internal/events/index.js.map +1 -0
  200. package/dist/internal/events/interface.d.ts +47 -0
  201. package/dist/internal/events/interface.js +12 -0
  202. package/dist/internal/events/interface.js.map +1 -0
  203. package/dist/internal/events/volumeEventManager.d.ts +27 -0
  204. package/dist/internal/events/volumeEventManager.js +69 -0
  205. package/dist/internal/events/volumeEventManager.js.map +1 -0
  206. package/dist/internal/nodes/apiService.d.ts +54 -0
  207. package/dist/internal/nodes/apiService.js +308 -0
  208. package/dist/internal/nodes/apiService.js.map +1 -0
  209. package/dist/internal/nodes/apiService.test.d.ts +1 -0
  210. package/dist/internal/nodes/apiService.test.js +344 -0
  211. package/dist/internal/nodes/apiService.test.js.map +1 -0
  212. package/dist/internal/nodes/cache.d.ts +57 -0
  213. package/dist/internal/nodes/cache.js +226 -0
  214. package/dist/internal/nodes/cache.js.map +1 -0
  215. package/dist/internal/nodes/cache.test.d.ts +1 -0
  216. package/dist/internal/nodes/cache.test.js +160 -0
  217. package/dist/internal/nodes/cache.test.js.map +1 -0
  218. package/dist/internal/nodes/cryptoCache.d.ts +16 -0
  219. package/dist/internal/nodes/cryptoCache.js +50 -0
  220. package/dist/internal/nodes/cryptoCache.js.map +1 -0
  221. package/dist/internal/nodes/cryptoCache.test.d.ts +1 -0
  222. package/dist/internal/nodes/cryptoCache.test.js +79 -0
  223. package/dist/internal/nodes/cryptoCache.test.js.map +1 -0
  224. package/dist/internal/nodes/cryptoService.d.ts +75 -0
  225. package/dist/internal/nodes/cryptoService.js +409 -0
  226. package/dist/internal/nodes/cryptoService.js.map +1 -0
  227. package/dist/internal/nodes/cryptoService.test.d.ts +1 -0
  228. package/dist/internal/nodes/cryptoService.test.js +698 -0
  229. package/dist/internal/nodes/cryptoService.test.js.map +1 -0
  230. package/dist/internal/nodes/events.d.ts +91 -0
  231. package/dist/internal/nodes/events.js +243 -0
  232. package/dist/internal/nodes/events.js.map +1 -0
  233. package/dist/internal/nodes/events.test.d.ts +1 -0
  234. package/dist/internal/nodes/events.test.js +318 -0
  235. package/dist/internal/nodes/events.test.js.map +1 -0
  236. package/dist/internal/nodes/extendedAttributes.d.ts +23 -0
  237. package/dist/internal/nodes/extendedAttributes.js +117 -0
  238. package/dist/internal/nodes/extendedAttributes.js.map +1 -0
  239. package/dist/internal/nodes/extendedAttributes.test.d.ts +1 -0
  240. package/dist/internal/nodes/extendedAttributes.test.js +176 -0
  241. package/dist/internal/nodes/extendedAttributes.test.js.map +1 -0
  242. package/dist/internal/nodes/index.d.ts +26 -0
  243. package/dist/internal/nodes/index.js +40 -0
  244. package/dist/internal/nodes/index.js.map +1 -0
  245. package/dist/internal/nodes/index.test.d.ts +1 -0
  246. package/dist/internal/nodes/index.test.js +112 -0
  247. package/dist/internal/nodes/index.test.js.map +1 -0
  248. package/dist/internal/nodes/interface.d.ts +135 -0
  249. package/dist/internal/nodes/interface.js +3 -0
  250. package/dist/internal/nodes/interface.js.map +1 -0
  251. package/dist/internal/nodes/mediaTypes.d.ts +2 -0
  252. package/dist/internal/nodes/mediaTypes.js +13 -0
  253. package/dist/internal/nodes/mediaTypes.js.map +1 -0
  254. package/dist/internal/nodes/nodesAccess.d.ts +49 -0
  255. package/dist/internal/nodes/nodesAccess.js +332 -0
  256. package/dist/internal/nodes/nodesAccess.js.map +1 -0
  257. package/dist/internal/nodes/nodesAccess.test.d.ts +1 -0
  258. package/dist/internal/nodes/nodesAccess.test.js +487 -0
  259. package/dist/internal/nodes/nodesAccess.test.js.map +1 -0
  260. package/dist/internal/nodes/nodesManagement.d.ts +33 -0
  261. package/dist/internal/nodes/nodesManagement.js +222 -0
  262. package/dist/internal/nodes/nodesManagement.js.map +1 -0
  263. package/dist/internal/nodes/nodesManagement.test.d.ts +1 -0
  264. package/dist/internal/nodes/nodesManagement.test.js +178 -0
  265. package/dist/internal/nodes/nodesManagement.test.js.map +1 -0
  266. package/dist/internal/nodes/nodesRevisions.d.ts +18 -0
  267. package/dist/internal/nodes/nodesRevisions.js +55 -0
  268. package/dist/internal/nodes/nodesRevisions.js.map +1 -0
  269. package/dist/internal/nodes/validations.d.ts +4 -0
  270. package/dist/internal/nodes/validations.js +21 -0
  271. package/dist/internal/nodes/validations.js.map +1 -0
  272. package/dist/internal/photos/albums.d.ts +13 -0
  273. package/dist/internal/photos/albums.js +30 -0
  274. package/dist/internal/photos/albums.js.map +1 -0
  275. package/dist/internal/photos/apiService.d.ts +8 -0
  276. package/dist/internal/photos/apiService.js +18 -0
  277. package/dist/internal/photos/apiService.js.map +1 -0
  278. package/dist/internal/photos/cache.d.ts +6 -0
  279. package/dist/internal/photos/cache.js +15 -0
  280. package/dist/internal/photos/cache.js.map +1 -0
  281. package/dist/internal/photos/index.d.ts +9 -0
  282. package/dist/internal/photos/index.js +18 -0
  283. package/dist/internal/photos/index.js.map +1 -0
  284. package/dist/internal/photos/interface.d.ts +6 -0
  285. package/dist/internal/photos/interface.js +3 -0
  286. package/dist/internal/photos/interface.js.map +1 -0
  287. package/dist/internal/photos/photosTimeline.d.ts +10 -0
  288. package/dist/internal/photos/photosTimeline.js +20 -0
  289. package/dist/internal/photos/photosTimeline.js.map +1 -0
  290. package/dist/internal/sdkEvents.d.ts +12 -0
  291. package/dist/internal/sdkEvents.js +44 -0
  292. package/dist/internal/sdkEvents.js.map +1 -0
  293. package/dist/internal/sdkEvents.test.d.ts +1 -0
  294. package/dist/internal/sdkEvents.test.js +45 -0
  295. package/dist/internal/sdkEvents.test.js.map +1 -0
  296. package/dist/internal/shares/apiService.d.ts +51 -0
  297. package/dist/internal/shares/apiService.js +128 -0
  298. package/dist/internal/shares/apiService.js.map +1 -0
  299. package/dist/internal/shares/cache.d.ts +15 -0
  300. package/dist/internal/shares/cache.js +63 -0
  301. package/dist/internal/shares/cache.js.map +1 -0
  302. package/dist/internal/shares/cache.test.d.ts +1 -0
  303. package/dist/internal/shares/cache.test.js +54 -0
  304. package/dist/internal/shares/cache.test.js.map +1 -0
  305. package/dist/internal/shares/cryptoCache.d.ts +20 -0
  306. package/dist/internal/shares/cryptoCache.js +35 -0
  307. package/dist/internal/shares/cryptoCache.js.map +1 -0
  308. package/dist/internal/shares/cryptoCache.test.d.ts +1 -0
  309. package/dist/internal/shares/cryptoCache.test.js +58 -0
  310. package/dist/internal/shares/cryptoCache.test.js.map +1 -0
  311. package/dist/internal/shares/cryptoService.d.ts +42 -0
  312. package/dist/internal/shares/cryptoService.js +126 -0
  313. package/dist/internal/shares/cryptoService.js.map +1 -0
  314. package/dist/internal/shares/cryptoService.test.d.ts +1 -0
  315. package/dist/internal/shares/cryptoService.test.js +120 -0
  316. package/dist/internal/shares/cryptoService.test.js.map +1 -0
  317. package/dist/internal/shares/index.d.ts +15 -0
  318. package/dist/internal/shares/index.js +26 -0
  319. package/dist/internal/shares/index.js.map +1 -0
  320. package/dist/internal/shares/interface.d.ts +94 -0
  321. package/dist/internal/shares/interface.js +11 -0
  322. package/dist/internal/shares/interface.js.map +1 -0
  323. package/dist/internal/shares/manager.d.ts +68 -0
  324. package/dist/internal/shares/manager.js +186 -0
  325. package/dist/internal/shares/manager.js.map +1 -0
  326. package/dist/internal/shares/manager.test.d.ts +1 -0
  327. package/dist/internal/shares/manager.test.js +176 -0
  328. package/dist/internal/shares/manager.test.js.map +1 -0
  329. package/dist/internal/sharing/apiService.d.ts +80 -0
  330. package/dist/internal/sharing/apiService.js +325 -0
  331. package/dist/internal/sharing/apiService.js.map +1 -0
  332. package/dist/internal/sharing/cache.d.ts +37 -0
  333. package/dist/internal/sharing/cache.js +105 -0
  334. package/dist/internal/sharing/cache.js.map +1 -0
  335. package/dist/internal/sharing/cache.test.d.ts +1 -0
  336. package/dist/internal/sharing/cache.test.js +82 -0
  337. package/dist/internal/sharing/cache.test.js.map +1 -0
  338. package/dist/internal/sharing/cryptoService.d.ts +112 -0
  339. package/dist/internal/sharing/cryptoService.js +269 -0
  340. package/dist/internal/sharing/cryptoService.js.map +1 -0
  341. package/dist/internal/sharing/events.d.ts +57 -0
  342. package/dist/internal/sharing/events.js +153 -0
  343. package/dist/internal/sharing/events.js.map +1 -0
  344. package/dist/internal/sharing/events.test.d.ts +1 -0
  345. package/dist/internal/sharing/events.test.js +246 -0
  346. package/dist/internal/sharing/events.test.js.map +1 -0
  347. package/dist/internal/sharing/index.d.ts +20 -0
  348. package/dist/internal/sharing/index.js +30 -0
  349. package/dist/internal/sharing/index.js.map +1 -0
  350. package/dist/internal/sharing/interface.d.ts +169 -0
  351. package/dist/internal/sharing/interface.js +9 -0
  352. package/dist/internal/sharing/interface.js.map +1 -0
  353. package/dist/internal/sharing/sharingAccess.d.ts +32 -0
  354. package/dist/internal/sharing/sharingAccess.js +119 -0
  355. package/dist/internal/sharing/sharingAccess.js.map +1 -0
  356. package/dist/internal/sharing/sharingAccess.test.d.ts +1 -0
  357. package/dist/internal/sharing/sharingAccess.test.js +84 -0
  358. package/dist/internal/sharing/sharingAccess.test.js.map +1 -0
  359. package/dist/internal/sharing/sharingManagement.d.ts +43 -0
  360. package/dist/internal/sharing/sharingManagement.js +439 -0
  361. package/dist/internal/sharing/sharingManagement.js.map +1 -0
  362. package/dist/internal/sharing/sharingManagement.test.d.ts +1 -0
  363. package/dist/internal/sharing/sharingManagement.test.js +788 -0
  364. package/dist/internal/sharing/sharingManagement.test.js.map +1 -0
  365. package/dist/internal/uids.d.ts +38 -0
  366. package/dist/internal/uids.js +85 -0
  367. package/dist/internal/uids.js.map +1 -0
  368. package/dist/internal/upload/apiService.d.ts +65 -0
  369. package/dist/internal/upload/apiService.js +137 -0
  370. package/dist/internal/upload/apiService.js.map +1 -0
  371. package/dist/internal/upload/blockVerifier.d.ts +16 -0
  372. package/dist/internal/upload/blockVerifier.js +33 -0
  373. package/dist/internal/upload/blockVerifier.js.map +1 -0
  374. package/dist/internal/upload/chunkStreamReader.d.ts +13 -0
  375. package/dist/internal/upload/chunkStreamReader.js +46 -0
  376. package/dist/internal/upload/chunkStreamReader.js.map +1 -0
  377. package/dist/internal/upload/chunkStreamReader.test.d.ts +1 -0
  378. package/dist/internal/upload/chunkStreamReader.test.js +75 -0
  379. package/dist/internal/upload/chunkStreamReader.test.js.map +1 -0
  380. package/dist/internal/upload/controller.d.ts +8 -0
  381. package/dist/internal/upload/controller.js +25 -0
  382. package/dist/internal/upload/controller.js.map +1 -0
  383. package/dist/internal/upload/cryptoService.d.ts +29 -0
  384. package/dist/internal/upload/cryptoService.js +104 -0
  385. package/dist/internal/upload/cryptoService.js.map +1 -0
  386. package/dist/internal/upload/digests.d.ts +8 -0
  387. package/dist/internal/upload/digests.js +22 -0
  388. package/dist/internal/upload/digests.js.map +1 -0
  389. package/dist/internal/upload/fileUploader.d.ts +65 -0
  390. package/dist/internal/upload/fileUploader.js +463 -0
  391. package/dist/internal/upload/fileUploader.js.map +1 -0
  392. package/dist/internal/upload/fileUploader.test.d.ts +1 -0
  393. package/dist/internal/upload/fileUploader.test.js +393 -0
  394. package/dist/internal/upload/fileUploader.test.js.map +1 -0
  395. package/dist/internal/upload/index.d.ts +16 -0
  396. package/dist/internal/upload/index.js +77 -0
  397. package/dist/internal/upload/index.js.map +1 -0
  398. package/dist/internal/upload/interface.d.ts +117 -0
  399. package/dist/internal/upload/interface.js +3 -0
  400. package/dist/internal/upload/interface.js.map +1 -0
  401. package/dist/internal/upload/manager.d.ts +31 -0
  402. package/dist/internal/upload/manager.js +250 -0
  403. package/dist/internal/upload/manager.js.map +1 -0
  404. package/dist/internal/upload/manager.test.d.ts +1 -0
  405. package/dist/internal/upload/manager.test.js +349 -0
  406. package/dist/internal/upload/manager.test.js.map +1 -0
  407. package/dist/internal/upload/queue.d.ts +5 -0
  408. package/dist/internal/upload/queue.js +32 -0
  409. package/dist/internal/upload/queue.js.map +1 -0
  410. package/dist/internal/upload/telemetry.d.ts +15 -0
  411. package/dist/internal/upload/telemetry.js +111 -0
  412. package/dist/internal/upload/telemetry.js.map +1 -0
  413. package/dist/internal/upload/telemetry.test.d.ts +1 -0
  414. package/dist/internal/upload/telemetry.test.js +107 -0
  415. package/dist/internal/upload/telemetry.test.js.map +1 -0
  416. package/dist/internal/utils.d.ts +1 -0
  417. package/dist/internal/utils.js +13 -0
  418. package/dist/internal/utils.js.map +1 -0
  419. package/dist/internal/wait.d.ts +3 -0
  420. package/dist/internal/wait.js +28 -0
  421. package/dist/internal/wait.js.map +1 -0
  422. package/dist/internal/wait.test.d.ts +1 -0
  423. package/dist/internal/wait.test.js +21 -0
  424. package/dist/internal/wait.test.js.map +1 -0
  425. package/dist/protonDriveClient.d.ts +593 -0
  426. package/dist/protonDriveClient.js +768 -0
  427. package/dist/protonDriveClient.js.map +1 -0
  428. package/dist/protonDrivePhotosClient.d.ts +16 -0
  429. package/dist/protonDrivePhotosClient.js +46 -0
  430. package/dist/protonDrivePhotosClient.js.map +1 -0
  431. package/dist/telemetry.d.ts +187 -0
  432. package/dist/telemetry.js +297 -0
  433. package/dist/telemetry.js.map +1 -0
  434. package/dist/tests/logger.d.ts +2 -0
  435. package/dist/tests/logger.js +12 -0
  436. package/dist/tests/logger.js.map +1 -0
  437. package/dist/tests/telemetry.d.ts +2 -0
  438. package/dist/tests/telemetry.js +11 -0
  439. package/dist/tests/telemetry.js.map +1 -0
  440. package/dist/transformers.d.ts +17 -0
  441. package/dist/transformers.js +77 -0
  442. package/dist/transformers.js.map +1 -0
  443. package/dist/version.d.ts +1 -0
  444. package/dist/version.js +6 -0
  445. package/dist/version.js.map +1 -0
  446. package/package.json +49 -0
  447. package/src/cache/index.ts +2 -0
  448. package/src/cache/interface.ts +104 -0
  449. package/src/cache/memoryCache.test.ts +150 -0
  450. package/src/cache/memoryCache.ts +85 -0
  451. package/src/config.ts +9 -0
  452. package/src/crypto/driveCrypto.test.ts +45 -0
  453. package/src/crypto/driveCrypto.ts +696 -0
  454. package/src/crypto/hmac.ts +46 -0
  455. package/src/crypto/index.ts +6 -0
  456. package/src/crypto/interface.ts +230 -0
  457. package/src/crypto/openPGPCrypto.ts +398 -0
  458. package/src/crypto/utils.ts +40 -0
  459. package/src/errors.ts +168 -0
  460. package/src/index.ts +30 -0
  461. package/src/interface/account.ts +38 -0
  462. package/src/interface/author.ts +29 -0
  463. package/src/interface/devices.ts +21 -0
  464. package/src/interface/download.ts +32 -0
  465. package/src/interface/events.ts +30 -0
  466. package/src/interface/httpClient.ts +42 -0
  467. package/src/interface/index.ts +46 -0
  468. package/src/interface/nodes.ts +168 -0
  469. package/src/interface/result.ts +11 -0
  470. package/src/interface/sharing.ts +87 -0
  471. package/src/interface/telemetry.ts +107 -0
  472. package/src/interface/thumbnail.ts +14 -0
  473. package/src/interface/upload.ts +19 -0
  474. package/src/internal/apiService/apiService.test.ts +285 -0
  475. package/src/internal/apiService/apiService.ts +353 -0
  476. package/src/internal/apiService/coreTypes.ts +24439 -0
  477. package/src/internal/apiService/driveTypes.ts +11841 -0
  478. package/src/internal/apiService/errorCodes.ts +38 -0
  479. package/src/internal/apiService/errors.test.ts +63 -0
  480. package/src/internal/apiService/errors.ts +91 -0
  481. package/src/internal/apiService/index.ts +7 -0
  482. package/src/internal/apiService/observerStream.ts +10 -0
  483. package/src/internal/apiService/transformers.ts +45 -0
  484. package/src/internal/batchLoading.test.ts +58 -0
  485. package/src/internal/batchLoading.ts +74 -0
  486. package/src/internal/devices/apiService.ts +142 -0
  487. package/src/internal/devices/cryptoService.ts +65 -0
  488. package/src/internal/devices/index.ts +31 -0
  489. package/src/internal/devices/interface.ts +28 -0
  490. package/src/internal/devices/manager.test.ts +129 -0
  491. package/src/internal/devices/manager.ts +113 -0
  492. package/src/internal/download/apiService.ts +145 -0
  493. package/src/internal/download/controller.ts +22 -0
  494. package/src/internal/download/cryptoService.ts +96 -0
  495. package/src/internal/download/fileDownloader.test.ts +381 -0
  496. package/src/internal/download/fileDownloader.ts +266 -0
  497. package/src/internal/download/index.ts +122 -0
  498. package/src/internal/download/interface.ts +38 -0
  499. package/src/internal/download/queue.ts +30 -0
  500. package/src/internal/download/telemetry.test.ts +134 -0
  501. package/src/internal/download/telemetry.ts +115 -0
  502. package/src/internal/download/thumbnailDownloader.test.ts +226 -0
  503. package/src/internal/download/thumbnailDownloader.ts +250 -0
  504. package/src/internal/errors.test.ts +21 -0
  505. package/src/internal/errors.ts +28 -0
  506. package/src/internal/events/apiService.ts +87 -0
  507. package/src/internal/events/cache.test.ts +47 -0
  508. package/src/internal/events/cache.ts +80 -0
  509. package/src/internal/events/coreEventManager.ts +69 -0
  510. package/src/internal/events/eventManager.test.ts +139 -0
  511. package/src/internal/events/eventManager.ts +168 -0
  512. package/src/internal/events/index.ts +131 -0
  513. package/src/internal/events/interface.ts +51 -0
  514. package/src/internal/events/volumeEventManager.ts +74 -0
  515. package/src/internal/nodes/apiService.test.ts +394 -0
  516. package/src/internal/nodes/apiService.ts +455 -0
  517. package/src/internal/nodes/cache.test.ts +197 -0
  518. package/src/internal/nodes/cache.ts +240 -0
  519. package/src/internal/nodes/cryptoCache.test.ts +92 -0
  520. package/src/internal/nodes/cryptoCache.ts +47 -0
  521. package/src/internal/nodes/cryptoService.test.ts +814 -0
  522. package/src/internal/nodes/cryptoService.ts +550 -0
  523. package/src/internal/nodes/events.test.ts +383 -0
  524. package/src/internal/nodes/events.ts +271 -0
  525. package/src/internal/nodes/extendedAttributes.test.ts +177 -0
  526. package/src/internal/nodes/extendedAttributes.ts +180 -0
  527. package/src/internal/nodes/index.test.ts +135 -0
  528. package/src/internal/nodes/index.ts +52 -0
  529. package/src/internal/nodes/interface.ts +152 -0
  530. package/src/internal/nodes/mediaTypes.ts +10 -0
  531. package/src/internal/nodes/nodesAccess.test.ts +555 -0
  532. package/src/internal/nodes/nodesAccess.ts +360 -0
  533. package/src/internal/nodes/nodesManagement.test.ts +221 -0
  534. package/src/internal/nodes/nodesManagement.ts +272 -0
  535. package/src/internal/nodes/nodesRevisions.ts +58 -0
  536. package/src/internal/nodes/validations.ts +26 -0
  537. package/src/internal/photos/albums.ts +29 -0
  538. package/src/internal/photos/apiService.ts +16 -0
  539. package/src/internal/photos/cache.ts +11 -0
  540. package/src/internal/photos/index.ts +23 -0
  541. package/src/internal/photos/interface.ts +7 -0
  542. package/src/internal/photos/photosTimeline.ts +18 -0
  543. package/src/internal/sdkEvents.test.ts +55 -0
  544. package/src/internal/sdkEvents.ts +52 -0
  545. package/src/internal/shares/apiService.ts +176 -0
  546. package/src/internal/shares/cache.test.ts +58 -0
  547. package/src/internal/shares/cache.ts +64 -0
  548. package/src/internal/shares/cryptoCache.test.ts +70 -0
  549. package/src/internal/shares/cryptoCache.ts +35 -0
  550. package/src/internal/shares/cryptoService.test.ts +137 -0
  551. package/src/internal/shares/cryptoService.ts +143 -0
  552. package/src/internal/shares/index.ts +35 -0
  553. package/src/internal/shares/interface.ts +104 -0
  554. package/src/internal/shares/manager.test.ts +210 -0
  555. package/src/internal/shares/manager.ts +213 -0
  556. package/src/internal/sharing/apiService.ts +483 -0
  557. package/src/internal/sharing/cache.test.ts +99 -0
  558. package/src/internal/sharing/cache.ts +109 -0
  559. package/src/internal/sharing/cryptoService.ts +378 -0
  560. package/src/internal/sharing/events.test.ts +268 -0
  561. package/src/internal/sharing/events.ts +166 -0
  562. package/src/internal/sharing/index.ts +43 -0
  563. package/src/internal/sharing/interface.ts +177 -0
  564. package/src/internal/sharing/sharingAccess.test.ts +102 -0
  565. package/src/internal/sharing/sharingAccess.ts +133 -0
  566. package/src/internal/sharing/sharingManagement.test.ts +895 -0
  567. package/src/internal/sharing/sharingManagement.ts +521 -0
  568. package/src/internal/uids.ts +83 -0
  569. package/src/internal/upload/apiService.ts +243 -0
  570. package/src/internal/upload/blockVerifier.ts +40 -0
  571. package/src/internal/upload/chunkStreamReader.test.ts +89 -0
  572. package/src/internal/upload/chunkStreamReader.ts +49 -0
  573. package/src/internal/upload/controller.ts +25 -0
  574. package/src/internal/upload/cryptoService.ts +162 -0
  575. package/src/internal/upload/digests.ts +18 -0
  576. package/src/internal/upload/fileUploader.test.ts +513 -0
  577. package/src/internal/upload/fileUploader.ts +576 -0
  578. package/src/internal/upload/index.ts +126 -0
  579. package/src/internal/upload/interface.ts +128 -0
  580. package/src/internal/upload/manager.test.ts +390 -0
  581. package/src/internal/upload/manager.ts +320 -0
  582. package/src/internal/upload/queue.ts +31 -0
  583. package/src/internal/upload/telemetry.test.ts +129 -0
  584. package/src/internal/upload/telemetry.ts +121 -0
  585. package/src/internal/utils.ts +9 -0
  586. package/src/internal/wait.test.ts +21 -0
  587. package/src/internal/wait.ts +26 -0
  588. package/src/protonDriveClient.ts +861 -0
  589. package/src/protonDrivePhotosClient.ts +56 -0
  590. package/src/telemetry.ts +346 -0
  591. package/src/tests/logger.ts +10 -0
  592. package/src/tests/telemetry.ts +9 -0
  593. package/src/transformers.ts +98 -0
  594. package/src/version.ts +4 -0
@@ -0,0 +1,109 @@
1
+ import { ProtonDriveEntitiesCache } from "../../interface";
2
+ import { SharingType } from "./interface";
3
+
4
+ /**
5
+ * Provides caching for shared by me and with me listings.
6
+ *
7
+ * The cache is responsible for serialising and deserialising the node
8
+ * UIDs for each sharing type. Also, ensuring that only full lists are
9
+ * cached.
10
+ */
11
+ export class SharingCache {
12
+ /**
13
+ * Locally cached data to avoid unnecessary reads from the cache.
14
+ */
15
+ private cache: Map<SharingType, string[]> = new Map();
16
+
17
+ constructor(private driveCache: ProtonDriveEntitiesCache) {
18
+ this.driveCache = driveCache;
19
+ }
20
+
21
+ async getSharedByMeNodeUids(): Promise<string[]> {
22
+ return this.getNodeUids(SharingType.SharedByMe);
23
+ }
24
+
25
+ async addSharedByMeNodeUid(nodeUid: string): Promise<void> {
26
+ return this.addNodeUid(SharingType.SharedByMe, nodeUid);
27
+ }
28
+
29
+ async removeSharedByMeNodeUid(nodeUid: string): Promise<void> {
30
+ return this.removeNodeUid(SharingType.SharedByMe, nodeUid);
31
+ }
32
+
33
+ async setSharedByMeNodeUids(nodeUids: string[] | undefined): Promise<void> {
34
+ return this.setNodeUids(SharingType.SharedByMe, nodeUids);
35
+ }
36
+
37
+ async getSharedWithMeNodeUids(): Promise<string[]> {
38
+ return this.getNodeUids(SharingType.sharedWithMe);
39
+ }
40
+
41
+ async setSharedWithMeNodeUids(nodeUids: string[] | undefined): Promise<void> {
42
+ return this.setNodeUids(SharingType.sharedWithMe, nodeUids);
43
+ }
44
+
45
+ /**
46
+ * @throws Error if the cache is not set yet. First, the cache should be
47
+ * set by calling `setNodeUids` after full loading of the list.
48
+ */
49
+ private async addNodeUid(type: SharingType, nodeUid: string): Promise<void> {
50
+ let nodeUids;
51
+ try {
52
+ nodeUids = await this.getNodeUids(type);
53
+ } catch {
54
+ // This is developer error.
55
+ throw new Error('Calling add before setting the loaded items');
56
+ }
57
+ const set = new Set(nodeUids);
58
+ if (set.has(nodeUid)) {
59
+ return;
60
+ }
61
+ set.add(nodeUid);
62
+ await this.setNodeUids(type, [...set]);
63
+ }
64
+
65
+ /**
66
+ * @throws Error if the cache is not set yet. First, the cache should be
67
+ * set by calling `setNodeUids` after full loading of the list.
68
+ */
69
+ private async removeNodeUid(type: SharingType, nodeUid: string): Promise<void> {
70
+ let nodeUids;
71
+ try {
72
+ nodeUids = await this.getNodeUids(type);
73
+ } catch {
74
+ // This is developer error.
75
+ throw new Error('Calling remove before setting the loaded items');
76
+ }
77
+ const set = new Set(nodeUids);
78
+ if (!set.has(nodeUid)) {
79
+ return;
80
+ }
81
+ set.delete(nodeUid);
82
+ await this.setNodeUids(type, [...set]);
83
+ }
84
+
85
+ private async getNodeUids(type: SharingType): Promise<string[]> {
86
+ let nodeUids = this.cache.get(type);
87
+ if (nodeUids) {
88
+ return nodeUids;
89
+ }
90
+
91
+ const nodeUidsString = await this.driveCache.getEntity(`sharing-${type}-nodeUids`);
92
+ nodeUids = nodeUidsString.split(',');
93
+ this.cache.set(type, nodeUids);
94
+ return nodeUids;
95
+ }
96
+
97
+ /**
98
+ * @param nodeUids - Passing `undefined` will remove the cache.
99
+ */
100
+ private async setNodeUids(type: SharingType, nodeUids: string[] | undefined): Promise<void> {
101
+ if (nodeUids) {
102
+ this.cache.set(type, nodeUids);
103
+ await this.driveCache.setEntity(`sharing-${type}-nodeUids`, nodeUids.join(','));
104
+ } else {
105
+ this.cache.delete(type);
106
+ await this.driveCache.removeEntities([`sharing-${type}-nodeUids`]);
107
+ }
108
+ }
109
+ }
@@ -0,0 +1,378 @@
1
+ import bcrypt from 'bcryptjs';
2
+ import { c } from 'ttag';
3
+
4
+ import { DriveCrypto, PrivateKey, SessionKey, SRPVerifier, uint8ArrayToBase64String, VERIFICATION_STATUS } from '../../crypto';
5
+ import { ProtonDriveAccount, ProtonInvitation, ProtonInvitationWithNode, NonProtonInvitation, Author, Result, Member, UnverifiedAuthorError, resultError, resultOk } from "../../interface";
6
+ import { getErrorMessage, getVerificationMessage } from "../errors";
7
+ import { EncryptedShare } from "../shares";
8
+ import { EncryptedInvitation, EncryptedInvitationWithNode, EncryptedExternalInvitation, EncryptedMember, EncryptedPublicLink, PublicLinkWithCreatorEmail } from "./interface";
9
+
10
+ // Version 2 of bcrypt with 2**10 rounds.
11
+ // https://en.wikipedia.org/wiki/Bcrypt#Description
12
+ const BCRYPT_PREFIX = '$2y$10$';
13
+
14
+ export const PUBLIC_LINK_GENERATED_PASSWORD_LENGTH = 12;
15
+
16
+ // We do not support management of legacy public links anymore (that is no
17
+ // flag or bit 1). But we still need to support to read the legacy public
18
+ // link.
19
+ enum PublicLinkFlags {
20
+ Legacy = 0,
21
+ CustomPassword = 1,
22
+ GeneratedPasswordIncluded = 2,
23
+ GeneratedPasswordWithCustomPassword = 3,
24
+ }
25
+
26
+ /**
27
+ * Provides crypto operations for sharing.
28
+ *
29
+ * The sharing crypto service is responsible for encrypting and decrypting
30
+ * shares, invitations, etc.
31
+ */
32
+ export class SharingCryptoService {
33
+ constructor(
34
+ private driveCrypto: DriveCrypto,
35
+ private account: ProtonDriveAccount,
36
+ ) {
37
+ this.driveCrypto = driveCrypto;
38
+ this.account = account;
39
+ }
40
+
41
+ /**
42
+ * Generates a share key for a standard share used for sharing with other users.
43
+ *
44
+ * Standard share, in contrast to a root share, is encrypted with node key and
45
+ * can be managed by any admin.
46
+ */
47
+ async generateShareKeys(
48
+ nodeKeys: {
49
+ key: PrivateKey
50
+ passphraseSessionKey: SessionKey,
51
+ nameSessionKey: SessionKey,
52
+ },
53
+ addressKey: PrivateKey,
54
+ ): Promise<{
55
+ shareKey: {
56
+ encrypted: {
57
+ armoredKey: string,
58
+ armoredPassphrase: string,
59
+ armoredPassphraseSignature: string,
60
+ },
61
+ decrypted: {
62
+ key: PrivateKey,
63
+ passphraseSessionKey: SessionKey,
64
+ },
65
+ },
66
+ base64PpassphraseKeyPacket: string,
67
+ base64NameKeyPacket: string,
68
+ }> {
69
+ const shareKey = await this.driveCrypto.generateKey([nodeKeys.key, addressKey], addressKey);
70
+
71
+ const { base64KeyPacket: base64PpassphraseKeyPacket } = await this.driveCrypto.encryptSessionKey(
72
+ nodeKeys.passphraseSessionKey,
73
+ shareKey.decrypted.key,
74
+ );
75
+ const { base64KeyPacket: base64NameKeyPacket } = await this.driveCrypto.encryptSessionKey(
76
+ nodeKeys.nameSessionKey,
77
+ shareKey.decrypted.key,
78
+ );
79
+
80
+ return {
81
+ shareKey,
82
+ base64PpassphraseKeyPacket,
83
+ base64NameKeyPacket,
84
+ };
85
+ };
86
+
87
+ /**
88
+ * Decrypts a share using the node key.
89
+ *
90
+ * The share is encrypted with the node key and can be managed by any admin.
91
+ *
92
+ * Old shares are encrypted with address key only and thus available only
93
+ * to owners. `decryptShare` automatically tries to decrypt the share with
94
+ * address keys as fallback if available.
95
+ */
96
+ async decryptShare(share: EncryptedShare, nodeKey: PrivateKey): Promise<{
97
+ author: Author,
98
+ key: PrivateKey,
99
+ passphraseSessionKey: SessionKey,
100
+ }> {
101
+ // All standard shares should be encrypted with node key.
102
+ // Using node key is essential so any admin can manage the share.
103
+ // Old shares are encrypted with address key only and thus available
104
+ // only to owners. Adding address keys (if available) is a fallback
105
+ // solution until all shares are migrated.
106
+ const decryptionKeys = [nodeKey];
107
+ if (share.addressId) {
108
+ const address = await this.account.getOwnAddress(share.addressId);
109
+ decryptionKeys.push(...address.keys.map(({ key }) => key));
110
+ }
111
+ const addressPublicKeys = await this.account.getPublicKeys(share.creatorEmail);
112
+
113
+ const { key, passphraseSessionKey, verified } = await this.driveCrypto.decryptKey(
114
+ share.encryptedCrypto.armoredKey,
115
+ share.encryptedCrypto.armoredPassphrase,
116
+ share.encryptedCrypto.armoredPassphraseSignature,
117
+ decryptionKeys,
118
+ addressPublicKeys,
119
+ )
120
+
121
+ const author: Result<string, UnverifiedAuthorError> = verified === VERIFICATION_STATUS.SIGNED_AND_VALID
122
+ ? resultOk(share.creatorEmail)
123
+ : resultError({
124
+ claimedAuthor: share.creatorEmail,
125
+ error: getVerificationMessage(verified),
126
+ });
127
+
128
+ return {
129
+ author,
130
+ key,
131
+ passphraseSessionKey,
132
+ }
133
+ }
134
+
135
+ /**
136
+ * Encrypts an invitation for sharing a node with another user.
137
+ *
138
+ * `inviteeEmail` is used to load public key of the invitee and used to
139
+ * encrypt share's session key. `inviterKey` is used to sign the invitation.
140
+ */
141
+ async encryptInvitation(
142
+ shareSessionKey: SessionKey,
143
+ inviterKey: PrivateKey,
144
+ inviteeEmail: string,
145
+ ): Promise<{
146
+ base64KeyPacket: string,
147
+ base64KeyPacketSignature: string,
148
+ }> {
149
+ const inviteePublicKeys = await this.account.getPublicKeys(inviteeEmail);
150
+ const result = await this.driveCrypto.encryptInvitation(shareSessionKey, inviteePublicKeys[0], inviterKey)
151
+ return result;
152
+ };
153
+
154
+ /**
155
+ * Decrypts and verifies an invitation and node's name.
156
+ */
157
+ async decryptInvitationWithNode(encryptedInvitation: EncryptedInvitationWithNode): Promise<ProtonInvitationWithNode> {
158
+ const inviteeAddress = await this.account.getOwnAddress(encryptedInvitation.inviteeEmail);
159
+ const inviteeKey = inviteeAddress.keys[inviteeAddress.primaryKeyIndex].key;
160
+
161
+ const shareKey = await this.driveCrypto.decryptUnsignedKey(
162
+ encryptedInvitation.share.armoredKey,
163
+ encryptedInvitation.share.armoredPassphrase,
164
+ inviteeKey,
165
+ );
166
+
167
+ let nodeName: Result<string, Error>;
168
+ try {
169
+ const result = await this.driveCrypto.decryptNodeName(
170
+ encryptedInvitation.node.encryptedName,
171
+ shareKey,
172
+ [],
173
+ );
174
+ nodeName = resultOk(result.name);
175
+ } catch (error: unknown) {
176
+ const message = getErrorMessage(error);
177
+ const errorMessage = c('Error').t`Failed to decrypt item name: ${message}`;
178
+ nodeName = resultError(new Error(errorMessage));
179
+ }
180
+
181
+ return {
182
+ ...await this.decryptInvitation(encryptedInvitation),
183
+ node: {
184
+ name: nodeName,
185
+ type: encryptedInvitation.node.type,
186
+ mediaType: encryptedInvitation.node.mediaType,
187
+ },
188
+ }
189
+ }
190
+
191
+ /**
192
+ * Verifies an invitation.
193
+ */
194
+ async decryptInvitation(encryptedInvitation: EncryptedInvitation): Promise<ProtonInvitation> {
195
+ // TODO: verify addedByEmail (current client doesnt do this)
196
+ const addedByEmail: Result<string, UnverifiedAuthorError> = resultOk(encryptedInvitation.addedByEmail);
197
+
198
+ return {
199
+ uid: encryptedInvitation.uid,
200
+ invitationTime: encryptedInvitation.invitationTime,
201
+ addedByEmail: addedByEmail,
202
+ inviteeEmail: encryptedInvitation.inviteeEmail,
203
+ role: encryptedInvitation.role,
204
+ };
205
+ }
206
+
207
+ /**
208
+ * Accepts an invitation by signing the session key by invitee.
209
+ */
210
+ async acceptInvitation(encryptedInvitation: EncryptedInvitationWithNode): Promise<{
211
+ base64SessionKeySignature: string,
212
+ }> {
213
+ const inviteeAddress = await this.account.getOwnAddress(encryptedInvitation.inviteeEmail);
214
+ const inviteeKey = inviteeAddress.keys[inviteeAddress.primaryKeyIndex].key;
215
+ const result = await this.driveCrypto.acceptInvitation(
216
+ encryptedInvitation.base64KeyPacket,
217
+ inviteeKey,
218
+ );
219
+ return result;
220
+ }
221
+
222
+ /**
223
+ * Encrypts an external invitation for sharing a node with another user.
224
+ *
225
+ * `inviteeEmail` is used to sign the invitation with `inviterKey`.
226
+ *
227
+ * External invitations are used to share nodes with users who are not
228
+ * registered with Proton Drive. The external invitation then requires
229
+ * the invitee to sign up to create key. Then it can be followed by
230
+ * regular invitation flow.
231
+ */
232
+ async encryptExternalInvitation(
233
+ shareSessionKey: SessionKey,
234
+ inviterKey: PrivateKey,
235
+ inviteeEmail: string,
236
+ ): Promise<{
237
+ base64ExternalInvitationSignature: string,
238
+ }> {
239
+ const result = await this.driveCrypto.encryptExternalInvitation(shareSessionKey, inviterKey, inviteeEmail);
240
+ return result;
241
+ }
242
+
243
+ /**
244
+ * Verifies an external invitation.
245
+ */
246
+ async decryptExternalInvitation(encryptedInvitation: EncryptedExternalInvitation): Promise<NonProtonInvitation> {
247
+ // TODO: verify addedByEmail (current client doesnt do this)
248
+ const addedByEmail: Result<string, UnverifiedAuthorError> = resultOk(encryptedInvitation.addedByEmail);
249
+
250
+ return {
251
+ uid: encryptedInvitation.uid,
252
+ invitationTime: encryptedInvitation.invitationTime,
253
+ addedByEmail: addedByEmail,
254
+ inviteeEmail: encryptedInvitation.inviteeEmail,
255
+ role: encryptedInvitation.role,
256
+ state: encryptedInvitation.state,
257
+ };
258
+ }
259
+
260
+ /**
261
+ * Verifies a member.
262
+ */
263
+ async decryptMember(encryptedMember: EncryptedMember): Promise<Member> {
264
+ // TODO: verify addedByEmail (current client doesnt do this)
265
+ const addedByEmail: Result<string, UnverifiedAuthorError> = resultOk(encryptedMember.addedByEmail);
266
+
267
+ return {
268
+ uid: encryptedMember.uid,
269
+ invitationTime: encryptedMember.invitationTime,
270
+ addedByEmail: addedByEmail,
271
+ inviteeEmail: encryptedMember.inviteeEmail,
272
+ role: encryptedMember.role,
273
+ };
274
+ }
275
+
276
+ async encryptPublicLink(creatorEmail: string, shareSessionKey: SessionKey, password: string): Promise<{
277
+ crypto: {
278
+ base64SharePasswordSalt: string,
279
+ base64SharePassphraseKeyPacket: string,
280
+ armoredPassword: string,
281
+ },
282
+ srp: SRPVerifier,
283
+ }> {
284
+ const address = await this.account.getOwnAddress(creatorEmail);
285
+ const addressKey = address.keys[address.primaryKeyIndex].key;
286
+
287
+ const { base64Salt: base64SharePasswordSalt, bcryptPassphrase } = await this.computeKeySaltAndPassphrase(password);
288
+ const { base64SharePassphraseKeyPacket, armoredPassword, srp } = await this.driveCrypto.encryptPublicLinkPasswordAndSessionKey(password, addressKey, bcryptPassphrase, shareSessionKey);
289
+
290
+ return {
291
+ crypto: {
292
+ base64SharePasswordSalt,
293
+ base64SharePassphraseKeyPacket,
294
+ armoredPassword,
295
+ },
296
+ srp,
297
+ }
298
+ }
299
+
300
+ async generatePublicLinkPassword(): Promise<string> {
301
+ const charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
302
+ const values = crypto.getRandomValues(new Uint32Array(PUBLIC_LINK_GENERATED_PASSWORD_LENGTH));
303
+
304
+ let result = '';
305
+ for (let i = 0; i < PUBLIC_LINK_GENERATED_PASSWORD_LENGTH; i++) {
306
+ result += charset[values[i] % charset.length];
307
+ }
308
+
309
+ return result;
310
+ }
311
+
312
+ private async computeKeySaltAndPassphrase(password: string) {
313
+ if (!password) {
314
+ throw new Error('Password required.');
315
+ }
316
+
317
+ const salt = crypto.getRandomValues(new Uint8Array(16));
318
+ const hash: string = await bcrypt.hash(password, BCRYPT_PREFIX + bcrypt.encodeBase64(salt, 16));
319
+ // Remove bcrypt prefix and salt (first 29 characters)
320
+ const bcryptPassphrase = hash.slice(29);
321
+
322
+ return {
323
+ base64Salt: uint8ArrayToBase64String(salt),
324
+ bcryptPassphrase,
325
+ }
326
+ };
327
+
328
+ async decryptPublicLink(encryptedPublicLink: EncryptedPublicLink): Promise<PublicLinkWithCreatorEmail> {
329
+ const address = await this.account.getOwnAddress(encryptedPublicLink.creatorEmail);
330
+ const addressKeys = address.keys.map(({ key }) => key);
331
+
332
+ const { password, customPassword } = await this.decryptShareUrlPassword(
333
+ encryptedPublicLink,
334
+ addressKeys,
335
+ );
336
+
337
+ return {
338
+ uid: encryptedPublicLink.uid,
339
+ creationTime: encryptedPublicLink.creationTime,
340
+ expirationTime: encryptedPublicLink.expirationTime,
341
+ role: encryptedPublicLink.role,
342
+ url: `${encryptedPublicLink.publicUrl}#${password}`,
343
+ customPassword,
344
+ creatorEmail: encryptedPublicLink.creatorEmail,
345
+ }
346
+ }
347
+
348
+ private async decryptShareUrlPassword(
349
+ encryptedPublicLink: EncryptedPublicLink,
350
+ addressKeys: PrivateKey[],
351
+ ): Promise<{
352
+ password: string,
353
+ customPassword?: string,
354
+ }> {
355
+ const password = await this.driveCrypto.decryptShareUrlPassword(
356
+ encryptedPublicLink.armoredUrlPassword,
357
+ addressKeys,
358
+ );
359
+
360
+ switch (encryptedPublicLink.flags) {
361
+ // This is legacy that is not supported anymore.
362
+ // Availalbe only for reading.
363
+ case PublicLinkFlags.Legacy:
364
+ case PublicLinkFlags.CustomPassword:
365
+ return {
366
+ password,
367
+ }
368
+ case PublicLinkFlags.GeneratedPasswordIncluded:
369
+ case PublicLinkFlags.GeneratedPasswordWithCustomPassword:
370
+ return {
371
+ password: password.substring(0, PUBLIC_LINK_GENERATED_PASSWORD_LENGTH),
372
+ customPassword: password.substring(PUBLIC_LINK_GENERATED_PASSWORD_LENGTH) || undefined,
373
+ }
374
+ default:
375
+ throw new Error(`Unsupported public link with flags: ${encryptedPublicLink.flags}`);
376
+ }
377
+ }
378
+ }