spec-3nweb-server 1.8.4 → 1.8.6

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 (324) hide show
  1. package/.gitlab-ci-linux.yml +50 -0
  2. package/.gitlab-ci-mac.yml +29 -0
  3. package/.gitlab-ci-windows.yml +29 -0
  4. package/.gitlab-ci.yml +63 -0
  5. package/build/3nstorage/routes/owner/archive-obj-version.js +2 -2
  6. package/build/3nstorage/routes/owner/cancel-trans.js +2 -2
  7. package/build/3nstorage/routes/owner/delete-obj.js +2 -2
  8. package/build/3nstorage/routes/owner/get-current-obj.js +3 -4
  9. package/build/3nstorage/routes/owner/param-setter.js +2 -6
  10. package/build/asmail/routes/config/param-setter.js +2 -2
  11. package/build/asmail/routes/delivery/finalize-delivery.js +2 -2
  12. package/build/asmail/routes/delivery/put-obj.js +2 -2
  13. package/build/asmail/routes/delivery/sender-authorization.js +2 -2
  14. package/build/asmail/routes/retrieval/remove-message.js +2 -2
  15. package/build/cli/signup-cmd.js +0 -1
  16. package/build/lib-server/routes/sessions/close.js +2 -2
  17. package/build/lib-server/routes/sessions/mid-auth.js +2 -5
  18. package/build/main.js +12 -15
  19. package/build/mock/tls-options.js +46 -44
  20. package/build/signup/routes/add.js +4 -4
  21. package/build/tests/admin-proto/signup.d.ts +1 -0
  22. package/build/tests/admin-proto/signup.js +235 -0
  23. package/build/tests/jasmine.d.ts +1 -0
  24. package/build/tests/jasmine.js +32 -0
  25. package/build/tests/libs-for-tests/3nstorage.d.ts +22 -0
  26. package/build/tests/libs-for-tests/3nstorage.js +123 -0
  27. package/build/tests/libs-for-tests/asmail.d.ts +22 -0
  28. package/build/tests/libs-for-tests/asmail.js +179 -0
  29. package/build/tests/libs-for-tests/assert.d.ts +1 -0
  30. package/build/tests/libs-for-tests/assert.js +26 -0
  31. package/build/tests/libs-for-tests/async-jasmine.d.ts +7 -0
  32. package/build/tests/libs-for-tests/async-jasmine.js +77 -0
  33. package/build/tests/libs-for-tests/bytes-equal.d.ts +1 -0
  34. package/build/tests/libs-for-tests/bytes-equal.js +34 -0
  35. package/build/tests/libs-for-tests/json-copy.d.ts +1 -0
  36. package/build/tests/libs-for-tests/json-copy.js +45 -0
  37. package/build/tests/libs-for-tests/json-equal.d.ts +4 -0
  38. package/build/tests/libs-for-tests/json-equal.js +67 -0
  39. package/build/tests/libs-for-tests/mailerid.d.ts +13 -0
  40. package/build/tests/libs-for-tests/mailerid.js +114 -0
  41. package/build/tests/libs-for-tests/pkl.d.ts +28 -0
  42. package/build/tests/libs-for-tests/pkl.js +89 -0
  43. package/build/tests/libs-for-tests/server-components/3nstorage.d.ts +20 -0
  44. package/build/tests/libs-for-tests/server-components/3nstorage.js +200 -0
  45. package/build/tests/libs-for-tests/server-components/admin.d.ts +6 -0
  46. package/build/tests/libs-for-tests/server-components/admin.js +43 -0
  47. package/build/tests/libs-for-tests/server-components/asmail.d.ts +16 -0
  48. package/build/tests/libs-for-tests/server-components/asmail.js +143 -0
  49. package/build/tests/libs-for-tests/server-components/component.d.ts +13 -0
  50. package/build/tests/libs-for-tests/server-components/component.js +77 -0
  51. package/build/tests/libs-for-tests/server-components/mailerid.d.ts +10 -0
  52. package/build/tests/libs-for-tests/server-components/mailerid.js +103 -0
  53. package/build/tests/libs-for-tests/server-runner.d.ts +15 -0
  54. package/build/tests/libs-for-tests/server-runner.js +69 -0
  55. package/build/tests/libs-for-tests/spec-assembly.d.ts +6 -0
  56. package/build/tests/libs-for-tests/spec-assembly.js +55 -0
  57. package/build/tests/libs-for-tests/ws-utils.d.ts +3 -0
  58. package/build/tests/libs-for-tests/ws-utils.js +59 -0
  59. package/build/tests/libs-for-tests/xhr-utils.d.ts +61 -0
  60. package/build/tests/libs-for-tests/xhr-utils.js +154 -0
  61. package/build/tests/protocols/3nstorage/owner/specs/archive-obj-ver.d.ts +2 -0
  62. package/build/tests/protocols/3nstorage/owner/specs/archive-obj-ver.js +84 -0
  63. package/build/tests/protocols/3nstorage/owner/specs/archive-root-ver.d.ts +2 -0
  64. package/build/tests/protocols/3nstorage/owner/specs/archive-root-ver.js +78 -0
  65. package/build/tests/protocols/3nstorage/owner/specs/delete-archive-obj-ver.d.ts +2 -0
  66. package/build/tests/protocols/3nstorage/owner/specs/delete-archive-obj-ver.js +83 -0
  67. package/build/tests/protocols/3nstorage/owner/specs/delete-archive-root-ver.d.ts +2 -0
  68. package/build/tests/protocols/3nstorage/owner/specs/delete-archive-root-ver.js +77 -0
  69. package/build/tests/protocols/3nstorage/owner/specs/delete-obj.d.ts +2 -0
  70. package/build/tests/protocols/3nstorage/owner/specs/delete-obj.js +75 -0
  71. package/build/tests/protocols/3nstorage/owner/specs/events.d.ts +2 -0
  72. package/build/tests/protocols/3nstorage/owner/specs/events.js +91 -0
  73. package/build/tests/protocols/3nstorage/owner/specs/get-current-obj.d.ts +2 -0
  74. package/build/tests/protocols/3nstorage/owner/specs/get-current-obj.js +269 -0
  75. package/build/tests/protocols/3nstorage/owner/specs/get-current-root.d.ts +2 -0
  76. package/build/tests/protocols/3nstorage/owner/specs/get-current-root.js +262 -0
  77. package/build/tests/protocols/3nstorage/owner/specs/get-obj-status.d.ts +2 -0
  78. package/build/tests/protocols/3nstorage/owner/specs/get-obj-status.js +79 -0
  79. package/build/tests/protocols/3nstorage/owner/specs/get-root-status.d.ts +2 -0
  80. package/build/tests/protocols/3nstorage/owner/specs/get-root-status.js +72 -0
  81. package/build/tests/protocols/3nstorage/owner/specs/put-current-obj.d.ts +2 -0
  82. package/build/tests/protocols/3nstorage/owner/specs/put-current-obj.js +287 -0
  83. package/build/tests/protocols/3nstorage/owner/specs/put-current-root.d.ts +2 -0
  84. package/build/tests/protocols/3nstorage/owner/specs/put-current-root.js +274 -0
  85. package/build/tests/protocols/3nstorage/owner/specs/trans-cancel-root.d.ts +2 -0
  86. package/build/tests/protocols/3nstorage/owner/specs/trans-cancel-root.js +73 -0
  87. package/build/tests/protocols/3nstorage/owner/specs/trans-cancel.d.ts +2 -0
  88. package/build/tests/protocols/3nstorage/owner/specs/trans-cancel.js +72 -0
  89. package/build/tests/protocols/3nstorage/owner/test-utils.d.ts +14 -0
  90. package/build/tests/protocols/3nstorage/owner/test-utils.js +54 -0
  91. package/build/tests/protocols/3nstorage/owner.d.ts +1 -0
  92. package/build/tests/protocols/3nstorage/owner.js +138 -0
  93. package/build/tests/protocols/asmail/config.d.ts +1 -0
  94. package/build/tests/protocols/asmail/config.js +117 -0
  95. package/build/tests/protocols/asmail/delivery/specs/finalize-delivery.d.ts +2 -0
  96. package/build/tests/protocols/asmail/delivery/specs/finalize-delivery.js +60 -0
  97. package/build/tests/protocols/asmail/delivery/specs/provide-recipient-pubkey.d.ts +2 -0
  98. package/build/tests/protocols/asmail/delivery/specs/provide-recipient-pubkey.js +68 -0
  99. package/build/tests/protocols/asmail/delivery/specs/put-metadata.d.ts +2 -0
  100. package/build/tests/protocols/asmail/delivery/specs/put-metadata.js +83 -0
  101. package/build/tests/protocols/asmail/delivery/specs/put-obj.d.ts +2 -0
  102. package/build/tests/protocols/asmail/delivery/specs/put-obj.js +123 -0
  103. package/build/tests/protocols/asmail/delivery/specs/restart-session.d.ts +2 -0
  104. package/build/tests/protocols/asmail/delivery/specs/restart-session.js +79 -0
  105. package/build/tests/protocols/asmail/delivery/specs/start-session.d.ts +2 -0
  106. package/build/tests/protocols/asmail/delivery/specs/start-session.js +64 -0
  107. package/build/tests/protocols/asmail/delivery/test-utils.d.ts +16 -0
  108. package/build/tests/protocols/asmail/delivery/test-utils.js +46 -0
  109. package/build/tests/protocols/asmail/delivery.d.ts +1 -0
  110. package/build/tests/protocols/asmail/delivery.js +46 -0
  111. package/build/tests/protocols/asmail/retrieval/specs/events.d.ts +2 -0
  112. package/build/tests/protocols/asmail/retrieval/specs/events.js +62 -0
  113. package/build/tests/protocols/asmail/retrieval/specs/get-message-meta.d.ts +2 -0
  114. package/build/tests/protocols/asmail/retrieval/specs/get-message-meta.js +70 -0
  115. package/build/tests/protocols/asmail/retrieval/specs/get-message-obj.d.ts +2 -0
  116. package/build/tests/protocols/asmail/retrieval/specs/get-message-obj.js +166 -0
  117. package/build/tests/protocols/asmail/retrieval/specs/list-messages.d.ts +2 -0
  118. package/build/tests/protocols/asmail/retrieval/specs/list-messages.js +96 -0
  119. package/build/tests/protocols/asmail/retrieval/specs/remove-message.d.ts +2 -0
  120. package/build/tests/protocols/asmail/retrieval/specs/remove-message.js +66 -0
  121. package/build/tests/protocols/asmail/retrieval/test-utils.d.ts +17 -0
  122. package/build/tests/protocols/asmail/retrieval/test-utils.js +46 -0
  123. package/build/tests/protocols/asmail/retrieval.d.ts +1 -0
  124. package/build/tests/protocols/asmail/retrieval.js +92 -0
  125. package/build/tests/protocols/mailerid.d.ts +1 -0
  126. package/build/tests/protocols/mailerid.js +210 -0
  127. package/build/tests/shared-checks/check-mid-login.d.ts +2 -0
  128. package/build/tests/shared-checks/check-mid-login.js +131 -0
  129. package/build/tests/shared-checks/requests.d.ts +20 -0
  130. package/build/tests/shared-checks/requests.js +123 -0
  131. package/package.json +1 -1
  132. package/packing/create-deb.sh +57 -0
  133. package/packing/deb/lib/systemd/system/3nweb.service +11 -0
  134. package/packing/deb/postinst +44 -0
  135. package/packing/deb/usr/share/doc/3nweb-server/conf-for-postinstall.yaml +19 -0
  136. package/packing/deb/usr/share/doc/3nweb-server/copyright +22 -0
  137. package/publish-task.sh +10 -0
  138. package/push-to-github.sh +105 -0
  139. package/ts-code/3nstorage/3nstorage-app.ts +99 -0
  140. package/ts-code/3nstorage/owner.ts +178 -0
  141. package/ts-code/3nstorage/resources/sessions.ts +37 -0
  142. package/ts-code/3nstorage/resources/store.ts +896 -0
  143. package/ts-code/3nstorage/resources/users.ts +258 -0
  144. package/ts-code/3nstorage/routes/owner/archive-obj-version.ts +73 -0
  145. package/ts-code/3nstorage/routes/owner/cancel-trans.ts +58 -0
  146. package/ts-code/3nstorage/routes/owner/delete-obj.ts +103 -0
  147. package/ts-code/3nstorage/routes/owner/get-archived-obj-ver.ts +111 -0
  148. package/ts-code/3nstorage/routes/owner/get-current-obj.ts +122 -0
  149. package/ts-code/3nstorage/routes/owner/get-obj-status.ts +55 -0
  150. package/ts-code/3nstorage/routes/owner/param-getter.ts +51 -0
  151. package/ts-code/3nstorage/routes/owner/param-setter.ts +50 -0
  152. package/ts-code/3nstorage/routes/owner/put-current-obj.ts +284 -0
  153. package/ts-code/3nstorage/routes/owner/session-params.ts +49 -0
  154. package/ts-code/3nstorage/shared.ts +43 -0
  155. package/ts-code/asmail/asmail-app.ts +91 -0
  156. package/ts-code/asmail/config.ts +96 -0
  157. package/ts-code/asmail/delivery.ts +94 -0
  158. package/ts-code/asmail/resources/delivery-sessions.ts +118 -0
  159. package/ts-code/asmail/resources/inbox.ts +696 -0
  160. package/ts-code/asmail/resources/recipients.ts +495 -0
  161. package/ts-code/asmail/resources/sessions.ts +37 -0
  162. package/ts-code/asmail/retrieval.ts +96 -0
  163. package/ts-code/asmail/routes/config/param-getter.ts +49 -0
  164. package/ts-code/asmail/routes/config/param-setter.ts +49 -0
  165. package/ts-code/asmail/routes/delivery/finalize-delivery.ts +50 -0
  166. package/ts-code/asmail/routes/delivery/pre-flight.ts +132 -0
  167. package/ts-code/asmail/routes/delivery/provide-recipient-pubkey.ts +58 -0
  168. package/ts-code/asmail/routes/delivery/put-metadata.ts +94 -0
  169. package/ts-code/asmail/routes/delivery/put-obj.ts +166 -0
  170. package/ts-code/asmail/routes/delivery/restart-session.ts +130 -0
  171. package/ts-code/asmail/routes/delivery/sender-authorization.ts +81 -0
  172. package/ts-code/asmail/routes/delivery/start-session.ts +151 -0
  173. package/ts-code/asmail/routes/retrieval/get-message-meta.ts +53 -0
  174. package/ts-code/asmail/routes/retrieval/get-message-obj.ts +109 -0
  175. package/ts-code/asmail/routes/retrieval/list-messages.ts +70 -0
  176. package/ts-code/asmail/routes/retrieval/remove-message.ts +47 -0
  177. package/ts-code/cli/index.ts +82 -0
  178. package/ts-code/cli/run-cmd.ts +81 -0
  179. package/ts-code/cli/show-sample-config.ts +78 -0
  180. package/ts-code/cli/signup-cmd.ts +229 -0
  181. package/ts-code/cli/user-cmd.ts +68 -0
  182. package/ts-code/cli/utils.ts +105 -0
  183. package/ts-code/config/default-confs.ts +22 -0
  184. package/ts-code/config/from-yaml.ts +35 -0
  185. package/ts-code/config/letsencrypt.ts +77 -0
  186. package/ts-code/config/signup.ts +137 -0
  187. package/ts-code/lib-common/admin-api/signup.ts +120 -0
  188. package/ts-code/lib-common/assert.ts +22 -0
  189. package/ts-code/lib-common/async-fs-node.ts +656 -0
  190. package/ts-code/lib-common/buffer-utils.ts +124 -0
  191. package/ts-code/lib-common/byte-streaming/common.ts +166 -0
  192. package/ts-code/lib-common/bytes-equal.ts +25 -0
  193. package/ts-code/lib-common/canonical-address.ts +92 -0
  194. package/ts-code/lib-common/exceptions/error.ts +44 -0
  195. package/ts-code/lib-common/exceptions/file.ts +84 -0
  196. package/ts-code/lib-common/exceptions/http.ts +69 -0
  197. package/ts-code/lib-common/ipc/generic-ipc.ts +750 -0
  198. package/ts-code/lib-common/ipc/ws-ipc.ts +117 -0
  199. package/ts-code/lib-common/json-equal.ts +55 -0
  200. package/ts-code/lib-common/json-utils.ts +130 -0
  201. package/ts-code/lib-common/jwkeys.ts +246 -0
  202. package/ts-code/lib-common/map-of-sets.ts +60 -0
  203. package/ts-code/lib-common/mid-sigs-NaCl-Ed.ts +677 -0
  204. package/ts-code/lib-common/objs-on-disk/file-layout.ts +480 -0
  205. package/ts-code/lib-common/objs-on-disk/obj-file.ts +325 -0
  206. package/ts-code/lib-common/objs-on-disk/utils.ts +201 -0
  207. package/ts-code/lib-common/objs-on-disk/v1-obj-file-format.ts +329 -0
  208. package/ts-code/lib-common/processes.ts +501 -0
  209. package/ts-code/lib-common/random-node.ts +79 -0
  210. package/ts-code/lib-common/service-api/3nstorage/owner.ts +559 -0
  211. package/ts-code/lib-common/service-api/3nstorage/root-route.ts +22 -0
  212. package/ts-code/lib-common/service-api/asmail/config.ts +144 -0
  213. package/ts-code/lib-common/service-api/asmail/delivery.ts +250 -0
  214. package/ts-code/lib-common/service-api/asmail/retrieval.ts +238 -0
  215. package/ts-code/lib-common/service-api/asmail/root-route.ts +22 -0
  216. package/ts-code/lib-common/service-api/ipc-api.ts +44 -0
  217. package/ts-code/lib-common/service-api/locker.ts +44 -0
  218. package/ts-code/lib-common/service-api/mailer-id/login.ts +80 -0
  219. package/ts-code/lib-common/service-api/mailer-id/provisioning.ts +64 -0
  220. package/ts-code/lib-common/service-api/mailer-id/root-route.ts +25 -0
  221. package/ts-code/lib-common/service-api/pub-key-login.ts +75 -0
  222. package/ts-code/lib-common/service-api/web-socket-base.ts +87 -0
  223. package/ts-code/lib-common/session-encryptor.ts +54 -0
  224. package/ts-code/lib-common/time-window-cache.ts +74 -0
  225. package/ts-code/lib-common/transferable.d.ts +30 -0
  226. package/ts-code/lib-server/conf-util.ts +35 -0
  227. package/ts-code/lib-server/mid-access.ts +45 -0
  228. package/ts-code/lib-server/middleware/body-parsers.ts +248 -0
  229. package/ts-code/lib-server/middleware/error-handler.ts +79 -0
  230. package/ts-code/lib-server/pkl-access.ts +46 -0
  231. package/ts-code/lib-server/resources/dns.ts +151 -0
  232. package/ts-code/lib-server/resources/mailerid-authorizer.ts +115 -0
  233. package/ts-code/lib-server/resources/mem-backed-sessions-factory.ts +132 -0
  234. package/ts-code/lib-server/resources/server-data-folders.ts +160 -0
  235. package/ts-code/lib-server/resources/server-key-for-pkl-challenge.ts +41 -0
  236. package/ts-code/lib-server/resources/sessions.ts +232 -0
  237. package/ts-code/lib-server/resources/user-files.ts +147 -0
  238. package/ts-code/lib-server/routes/pub-key-login/complete-exchange.ts +63 -0
  239. package/ts-code/lib-server/routes/pub-key-login/start-exchange.ts +189 -0
  240. package/ts-code/lib-server/routes/sessions/close.ts +27 -0
  241. package/ts-code/lib-server/routes/sessions/mid-auth.ts +77 -0
  242. package/ts-code/lib-server/routes/sessions/start.ts +116 -0
  243. package/ts-code/lib-server/web-sockets/app.ts +339 -0
  244. package/ts-code/lib-server/web-sockets/server-events.ts +63 -0
  245. package/ts-code/lib.ts +29 -0
  246. package/ts-code/locker/locker-app.ts +60 -0
  247. package/ts-code/locker/resources/lockers.ts +17 -0
  248. package/ts-code/locker/resources/sessions.ts +37 -0
  249. package/ts-code/locker/routes/create-locker.ts +47 -0
  250. package/ts-code/mailerId/mailerId-app.ts +107 -0
  251. package/ts-code/mailerId/resources/certifier.ts +181 -0
  252. package/ts-code/mailerId/resources/sessions.ts +44 -0
  253. package/ts-code/mailerId/resources/users.ts +88 -0
  254. package/ts-code/mailerId/routes/certify.ts +68 -0
  255. package/ts-code/main.ts +304 -0
  256. package/ts-code/mock/dns.ts +106 -0
  257. package/ts-code/mock/mock-as-child-proc.ts +130 -0
  258. package/ts-code/mock/node-child-ipc.ts +69 -0
  259. package/ts-code/mock/run-in-proc.ts +111 -0
  260. package/ts-code/mock/tls-options.ts +73 -0
  261. package/ts-code/services.ts +138 -0
  262. package/ts-code/signup/resources/users.ts +429 -0
  263. package/ts-code/signup/routes/add.ts +65 -0
  264. package/ts-code/signup/routes/get-available-addresses.ts +49 -0
  265. package/ts-code/signup/routes/get-available-domains.ts +45 -0
  266. package/ts-code/signup/signup-app.ts +54 -0
  267. package/ts-code/signup/signup-tokens.ts +148 -0
  268. package/ts-code/tests/admin-proto/signup.ts +277 -0
  269. package/ts-code/tests/jasmine.ts +37 -0
  270. package/ts-code/tests/libs-for-tests/3nstorage.ts +144 -0
  271. package/ts-code/tests/libs-for-tests/asmail.ts +220 -0
  272. package/ts-code/tests/libs-for-tests/assert.ts +22 -0
  273. package/ts-code/tests/libs-for-tests/async-jasmine.ts +89 -0
  274. package/ts-code/tests/libs-for-tests/bytes-equal.ts +25 -0
  275. package/ts-code/tests/libs-for-tests/json-copy.ts +38 -0
  276. package/ts-code/tests/libs-for-tests/json-equal.ts +55 -0
  277. package/ts-code/tests/libs-for-tests/mailerid.ts +123 -0
  278. package/ts-code/tests/libs-for-tests/pkl.ts +127 -0
  279. package/ts-code/tests/libs-for-tests/server-components/3nstorage.ts +206 -0
  280. package/ts-code/tests/libs-for-tests/server-components/admin.ts +49 -0
  281. package/ts-code/tests/libs-for-tests/server-components/asmail.ts +152 -0
  282. package/ts-code/tests/libs-for-tests/server-components/component.ts +90 -0
  283. package/ts-code/tests/libs-for-tests/server-components/mailerid.ts +114 -0
  284. package/ts-code/tests/libs-for-tests/server-runner.ts +82 -0
  285. package/ts-code/tests/libs-for-tests/spec-assembly.ts +60 -0
  286. package/ts-code/tests/libs-for-tests/ws-utils.ts +61 -0
  287. package/ts-code/tests/libs-for-tests/xhr-utils.ts +179 -0
  288. package/ts-code/tests/protocols/3nstorage/owner/specs/archive-obj-ver.ts +100 -0
  289. package/ts-code/tests/protocols/3nstorage/owner/specs/archive-root-ver.ts +91 -0
  290. package/ts-code/tests/protocols/3nstorage/owner/specs/delete-archive-obj-ver.ts +99 -0
  291. package/ts-code/tests/protocols/3nstorage/owner/specs/delete-archive-root-ver.ts +90 -0
  292. package/ts-code/tests/protocols/3nstorage/owner/specs/delete-obj.ts +84 -0
  293. package/ts-code/tests/protocols/3nstorage/owner/specs/events.ts +125 -0
  294. package/ts-code/tests/protocols/3nstorage/owner/specs/get-current-obj.ts +298 -0
  295. package/ts-code/tests/protocols/3nstorage/owner/specs/get-current-root.ts +290 -0
  296. package/ts-code/tests/protocols/3nstorage/owner/specs/get-obj-status.ts +88 -0
  297. package/ts-code/tests/protocols/3nstorage/owner/specs/get-root-status.ts +80 -0
  298. package/ts-code/tests/protocols/3nstorage/owner/specs/put-current-obj.ts +366 -0
  299. package/ts-code/tests/protocols/3nstorage/owner/specs/put-current-root.ts +329 -0
  300. package/ts-code/tests/protocols/3nstorage/owner/specs/trans-cancel-root.ts +86 -0
  301. package/ts-code/tests/protocols/3nstorage/owner/specs/trans-cancel.ts +86 -0
  302. package/ts-code/tests/protocols/3nstorage/owner/test-utils.ts +72 -0
  303. package/ts-code/tests/protocols/3nstorage/owner.ts +198 -0
  304. package/ts-code/tests/protocols/asmail/config.ts +172 -0
  305. package/ts-code/tests/protocols/asmail/delivery/specs/finalize-delivery.ts +69 -0
  306. package/ts-code/tests/protocols/asmail/delivery/specs/provide-recipient-pubkey.ts +88 -0
  307. package/ts-code/tests/protocols/asmail/delivery/specs/put-metadata.ts +102 -0
  308. package/ts-code/tests/protocols/asmail/delivery/specs/put-obj.ts +156 -0
  309. package/ts-code/tests/protocols/asmail/delivery/specs/restart-session.ts +97 -0
  310. package/ts-code/tests/protocols/asmail/delivery/specs/start-session.ts +79 -0
  311. package/ts-code/tests/protocols/asmail/delivery/test-utils.ts +64 -0
  312. package/ts-code/tests/protocols/asmail/delivery.ts +56 -0
  313. package/ts-code/tests/protocols/asmail/retrieval/specs/events.ts +78 -0
  314. package/ts-code/tests/protocols/asmail/retrieval/specs/get-message-meta.ts +80 -0
  315. package/ts-code/tests/protocols/asmail/retrieval/specs/get-message-obj.ts +197 -0
  316. package/ts-code/tests/protocols/asmail/retrieval/specs/list-messages.ts +110 -0
  317. package/ts-code/tests/protocols/asmail/retrieval/specs/remove-message.ts +74 -0
  318. package/ts-code/tests/protocols/asmail/retrieval/test-utils.ts +60 -0
  319. package/ts-code/tests/protocols/asmail/retrieval.ts +115 -0
  320. package/ts-code/tests/protocols/mailerid.ts +271 -0
  321. package/ts-code/tests/shared-checks/check-mid-login.ts +164 -0
  322. package/ts-code/tests/shared-checks/requests.ts +135 -0
  323. package/ts-code/tsconfig.json +11 -0
  324. package/ts-code/web3n.d.ts +1068 -0
@@ -0,0 +1,49 @@
1
+ /*
2
+ Copyright (C) 2015 - 2016, 2025 - 2026 3NSoft Inc.
3
+
4
+ This program is free software: you can redistribute it and/or modify it under
5
+ the terms of the GNU General Public License as published by the Free Software
6
+ Foundation, either version 3 of the License, or (at your option) any later
7
+ version.
8
+
9
+ This program is distributed in the hope that it will be useful, but
10
+ WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
+ See the GNU General Public License for more details.
13
+
14
+ You should have received a copy of the GNU General Public License along with
15
+ this program. If not, see <http://www.gnu.org/licenses/>.
16
+ */
17
+
18
+ import { RequestHandler } from 'express';
19
+ import { SetParam, SC as recipSC } from '../../resources/recipients';
20
+ import { PARAM_SC, ERR_SC } from '../../../lib-common/service-api/asmail/config';
21
+ import { Request } from '../../resources/sessions';
22
+ import { InboxParams } from '../../resources/inbox';
23
+
24
+ export function setParam<P extends keyof InboxParams>(paramSetter: SetParam<P>): RequestHandler {
25
+ return async (req: Request, res, next) => {
26
+
27
+ const session = req.session;
28
+ const userId = session.params.userId;
29
+ const pValue: InboxParams[P] = req.body;
30
+
31
+ try{
32
+ const valChanged = await paramSetter(userId, pValue)
33
+ if (valChanged) {
34
+ res.status(PARAM_SC.ok).send();
35
+ } else {
36
+ res.status(ERR_SC.malformed).send('Malformed parameter value.');
37
+ }
38
+ } catch (err) {
39
+ if (err === recipSC.USER_UNKNOWN) {
40
+ res.status(ERR_SC.server).send("Recipient disappeared from the system.");
41
+ session.close();
42
+ } else {
43
+ next(err);
44
+ }
45
+
46
+ }
47
+
48
+ };
49
+ }
@@ -0,0 +1,50 @@
1
+ /*
2
+ Copyright (C) 2015 - 2016, 2025 - 2026 3NSoft Inc.
3
+
4
+ This program is free software: you can redistribute it and/or modify it under
5
+ the terms of the GNU General Public License as published by the Free Software
6
+ Foundation, either version 3 of the License, or (at your option) any later
7
+ version.
8
+
9
+ This program is distributed in the hope that it will be useful, but
10
+ WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
+ See the GNU General Public License for more details.
13
+
14
+ You should have received a copy of the GNU General Public License along with
15
+ this program. If not, see <http://www.gnu.org/licenses/>.
16
+ */
17
+
18
+ import { RequestHandler } from 'express';
19
+ import { SC as recipSC, MsgDelivery } from '../../resources/recipients';
20
+ import { Request } from '../../resources/delivery-sessions';
21
+ import { completion as api, ERR_SC } from '../../../lib-common/service-api/asmail/delivery';
22
+
23
+ export function finalizeDelivery(finDelivFunc: MsgDelivery['finalizeDelivery']): RequestHandler {
24
+ return async (req: Request, res, next) => {
25
+ const session = req.session;
26
+ const recipient = session.params.recipient;
27
+ const msgId = session.params.msgId;
28
+
29
+ try {
30
+ await finDelivFunc(recipient, msgId);
31
+ session.close();
32
+ res.status(api.SC.ok).send();
33
+ } catch (err) {
34
+ if ('string' !== typeof err) {
35
+ next(err);
36
+ } else if (err === recipSC.USER_UNKNOWN) {
37
+ session.close();
38
+ res.status(ERR_SC.server).send("Recipient disappeared from the system.");
39
+ } else if (err === recipSC.MSG_UNKNOWN) {
40
+ session.close();
41
+ res.status(ERR_SC.server).send("Message disappeared from the system.");
42
+ } else {
43
+ next(new Error("Unhandled storage error code: "+err));
44
+ }
45
+ }
46
+
47
+ };
48
+ }
49
+
50
+ Object.freeze(exports);
@@ -0,0 +1,132 @@
1
+ /*
2
+ Copyright (C) 2015 - 2017, 2025 3NSoft Inc.
3
+
4
+ This program is free software: you can redistribute it and/or modify it under
5
+ the terms of the GNU General Public License as published by the Free Software
6
+ Foundation, either version 3 of the License, or (at your option) any later
7
+ version.
8
+
9
+ This program is distributed in the hope that it will be useful, but
10
+ WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
+ See the GNU General Public License for more details.
13
+
14
+ You should have received a copy of the GNU General Public License along with
15
+ this program. If not, see <http://www.gnu.org/licenses/>.
16
+ */
17
+
18
+ import { RequestHandler, Response } from 'express';
19
+ import { SC as recipSC, MsgDelivery } from '../../resources/recipients';
20
+ import { preFlight as api, ERR_SC, ErrorReply } from '../../../lib-common/service-api/asmail/delivery';
21
+ import { Request } from '../../resources/delivery-sessions';
22
+ import { Redirect } from './start-session';
23
+ import { checkAndTransformAddress } from '../../../lib-common/canonical-address';
24
+
25
+ /**
26
+ * This creates a pre-flight route handler.
27
+ * @param allowedMsgSizeFunc is a function returning promises, that may resolve to
28
+ * (1) undefined, if recipient is unknown,
29
+ * (2) zero (0), if leaving mail is forbidden,
30
+ * (3) greater than zero maximum message length, and
31
+ * (4) -1, if mail cannot be accepted due to full mail box.
32
+ * @param redirectFunc is an optional function that returns a promise,
33
+ * resolvable to
34
+ * (1) string with URI for ASMail service, which is serving given recipient,
35
+ * (2) undefined, if it is this server should service given recipient.
36
+ */
37
+ export function preFlight(
38
+ allowedMsgSizeFunc: MsgDelivery['allowedMaxMsgSize'], redirectFunc?: Redirect
39
+ ): RequestHandler {
40
+
41
+ async function serveRequestHere(
42
+ recipient: string, sender: string|undefined,
43
+ invitation: string|undefined, res: Response
44
+ ): Promise<void> {
45
+ const msgSize = await allowedMsgSizeFunc(recipient, sender, invitation);
46
+ if (msgSize > 0) {
47
+ res.status(api.SC.ok).json( <api.Reply> {
48
+ maxMsgLength: msgSize
49
+ });
50
+ } else if (msgSize === 0) {
51
+ res.status(api.SC.senderNotAllowed).json( <ErrorReply> {
52
+ error: `${sender ? sender : "Anonymous sender "} is not allowed to leave mail for ${recipient}`
53
+ });
54
+ } else if (msgSize === -1) {
55
+ res.status(api.SC.inboxFull).json( <ErrorReply> {
56
+ error: `Mail box for ${recipient} is full.`
57
+ });
58
+ } else {
59
+ throw new Error(`Unrecognized code ${msgSize} for message size limits.`);
60
+ }
61
+ }
62
+
63
+ return async (req: Request, res, next) => {
64
+
65
+ const rb: api.Request = req.body;
66
+ const recipient = checkAndTransformAddress(rb.recipient);
67
+ let sender = rb.sender;
68
+ const invitation = rb.invitation;
69
+ const session = req.session;
70
+
71
+ // already existing session indicates repeated call, which should be bounced off
72
+ if (session) {
73
+ res.status(ERR_SC.duplicateReq).json( <ErrorReply> {
74
+ error: "This protocol request has already been served."
75
+ });
76
+ return;
77
+ }
78
+
79
+ // missing recipient makes a bad request
80
+ if (!recipient) {
81
+ res.status(ERR_SC.malformed).json( <ErrorReply> {
82
+ error: "Recipient is either missing in the request, or is malformed"
83
+ });
84
+ return;
85
+ }
86
+
87
+ // if sender is given, we canonicalize the address
88
+ if (sender) {
89
+ sender = checkAndTransformAddress(sender);
90
+ if (!sender) {
91
+ res.status(ERR_SC.malformed).json( <ErrorReply> {
92
+ error: "Sender field is malformed"
93
+ });
94
+ return;
95
+ }
96
+ }
97
+
98
+ // check invitation field
99
+ if ((invitation !== undefined) && (typeof invitation !== 'string')) {
100
+ res.status(ERR_SC.malformed).json( <ErrorReply> {
101
+ error: "Inviation field is malformed"
102
+ });
103
+ return;
104
+ }
105
+
106
+ try {
107
+ if (redirectFunc) {
108
+ const redirectTo = await redirectFunc(recipient);
109
+ if (redirectTo) {
110
+ res.status(api.SC.redirect).json(<api.RedirectReply> {
111
+ redirect: redirectTo
112
+ });
113
+ } else {
114
+ await serveRequestHere(recipient, sender, invitation, res);
115
+ }
116
+ } else {
117
+ await serveRequestHere(recipient, sender, invitation, res);
118
+ }
119
+ } catch (err) {
120
+ if (err === recipSC.USER_UNKNOWN) {
121
+ res.status(api.SC.unknownRecipient).json( <ErrorReply> {
122
+ error: `Recipient ${recipient} is unknown.`
123
+ });
124
+ } else {
125
+ next(err);
126
+ }
127
+ }
128
+
129
+ };
130
+ }
131
+
132
+ Object.freeze(exports);
@@ -0,0 +1,58 @@
1
+ /*
2
+ Copyright (C) 2015 - 2016, 2025 3NSoft Inc.
3
+
4
+ This program is free software: you can redistribute it and/or modify it under
5
+ the terms of the GNU General Public License as published by the Free Software
6
+ Foundation, either version 3 of the License, or (at your option) any later
7
+ version.
8
+
9
+ This program is distributed in the hope that it will be useful, but
10
+ WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
+ See the GNU General Public License for more details.
13
+
14
+ You should have received a copy of the GNU General Public License along with
15
+ this program. If not, see <http://www.gnu.org/licenses/>.
16
+ */
17
+
18
+ import { RequestHandler } from 'express';
19
+ import { SC as recipSC, MsgDelivery } from '../../resources/recipients';
20
+ import { initPubKey as api, ERR_SC } from '../../../lib-common/service-api/asmail/delivery';
21
+ import { Request } from '../../resources/delivery-sessions';
22
+
23
+ /**
24
+ * This creates a get-init-pub-key route handler.
25
+ * @param pkeyProvidingFunc is a function that provides recipient's public key
26
+ * for use in this communication.
27
+ */
28
+ export function getRecipientPubKey(
29
+ pkeyProvidingFunc: MsgDelivery['getPubKey']
30
+ ): RequestHandler {
31
+ return async (req: Request, res, next) => {
32
+
33
+ const session = req.session;
34
+
35
+ try{
36
+ const certs = await pkeyProvidingFunc(session.params.recipient);
37
+ if (certs) {
38
+ res.status(api.SC.ok).json(certs);
39
+ } else {
40
+ res.status(api.SC.pkeyNotRegistered).send('No public key registered for the recipient.');
41
+ session.close();
42
+ }
43
+ } catch (err) {
44
+ if (typeof err !== "string") {
45
+ next(err);
46
+ } else if (err === recipSC.USER_UNKNOWN) {
47
+ res.status(ERR_SC.server).send(
48
+ "Recipient disappeared from the system.");
49
+ session.close();
50
+ } else {
51
+ next(new Error("Unhandled storage error code: "+err));
52
+ }
53
+ }
54
+
55
+ };
56
+ }
57
+
58
+ Object.freeze(exports);
@@ -0,0 +1,94 @@
1
+ /*
2
+ Copyright (C) 2015 - 2016, 2025 3NSoft Inc.
3
+
4
+ This program is free software: you can redistribute it and/or modify it under
5
+ the terms of the GNU General Public License as published by the Free Software
6
+ Foundation, either version 3 of the License, or (at your option) any later
7
+ version.
8
+
9
+ This program is distributed in the hope that it will be useful, but
10
+ WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
+ See the GNU General Public License for more details.
13
+
14
+ You should have received a copy of the GNU General Public License along with
15
+ this program. If not, see <http://www.gnu.org/licenses/>.
16
+ */
17
+
18
+ import { RequestHandler } from 'express';
19
+ import { SC as recipSC, MsgDelivery } from '../../resources/recipients';
20
+ import { msgMeta as api, ERR_SC, ErrorReply } from '../../../lib-common/service-api/asmail/delivery';
21
+ import * as confUtil from '../../../lib-server/conf-util';
22
+ import { Request } from '../../resources/delivery-sessions';
23
+ import { base64urlSafe } from '../../../lib-common/buffer-utils';
24
+
25
+ function findProblemWithObjIds(ids: string[]): ErrorReply|undefined {
26
+ if (!Array.isArray(ids)) {
27
+ return {
28
+ error: "Object ids are missing."
29
+ };
30
+ }
31
+ const checkedIds = new Set<string>();
32
+ for (const objId of ids) {
33
+ if (checkedIds.has(objId)) {
34
+ return {
35
+ error: "Duplication of object ids."
36
+ };
37
+ }
38
+ if (!base64urlSafe.allCharsFromAlphabet(objId!)) {
39
+ return {
40
+ error: "Object id is invalid."
41
+ };
42
+ }
43
+ checkedIds.add(objId);
44
+ }
45
+ return;
46
+ }
47
+
48
+ export function saveMetadata(
49
+ setMsgStorageFunc: MsgDelivery['setMsgStorage'], maxChunk: string|number
50
+ ): RequestHandler {
51
+
52
+ const maxChunkSize = confUtil.stringToNumOfBytes(maxChunk);
53
+
54
+ return async (req: Request, res, next) => {
55
+ const session = req.session;
56
+ const msgMeta: api.Request = req.body;
57
+ const recipient = session.params.recipient;
58
+ const objIds = msgMeta.objIds;
59
+
60
+ if (session.params.msgId) {
61
+ res.status(ERR_SC.duplicateReq).json( <ErrorReply> {
62
+ error: "This protocol request has already been served."
63
+ });
64
+ return;
65
+ }
66
+
67
+ if (findProblemWithObjIds(objIds)) {
68
+ res.status(ERR_SC.malformed).json(findProblemWithObjIds(objIds));
69
+ return;
70
+ }
71
+
72
+ try {
73
+ const msgId = await setMsgStorageFunc(recipient, msgMeta,
74
+ session.params.sender, session.params.invite,
75
+ session.params.maxMsgLength);
76
+ session.params.msgId = msgId;
77
+ res.status(api.SC.ok).json( <api.Reply> {
78
+ msgId,
79
+ maxChunkSize
80
+ });
81
+ } catch (err) {
82
+ if ("string" !== typeof err) {
83
+ next(err);
84
+ } else if (err === recipSC.USER_UNKNOWN) {
85
+ res.status(ERR_SC.server).send(
86
+ "Recipient disappeared from the system.");
87
+ session.close();
88
+ }
89
+ }
90
+
91
+ };
92
+ }
93
+
94
+ Object.freeze(exports);
@@ -0,0 +1,166 @@
1
+ /*
2
+ Copyright (C) 2015 - 2017, 2019 - 2020, 2025 - 2026 3NSoft Inc.
3
+
4
+ This program is free software: you can redistribute it and/or modify it under
5
+ the terms of the GNU General Public License as published by the Free Software
6
+ Foundation, either version 3 of the License, or (at your option) any later
7
+ version.
8
+
9
+ This program is distributed in the hope that it will be useful, but
10
+ WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
+ See the GNU General Public License for more details.
13
+
14
+ You should have received a copy of the GNU General Public License along with
15
+ this program. If not, see <http://www.gnu.org/licenses/>.
16
+ */
17
+
18
+ import { RequestHandler, Response } from 'express';
19
+ import { SC as recipSC, MsgDelivery, BIN_TYPE } from '../../resources/recipients';
20
+ import { msgObj as api, ERR_SC, HTTP_HEADER, PutObjFirstQueryOpts, PutObjSecondQueryOpts } from '../../../lib-common/service-api/asmail/delivery';
21
+ import * as confUtil from '../../../lib-server/conf-util';
22
+ import { Request } from '../../resources/delivery-sessions';
23
+ import { attachByteDrainToRequest } from '../../../lib-server/middleware/body-parsers';
24
+
25
+ export function saveMsgObj(saveObjFunc: MsgDelivery['saveObj'], chunkLimit: string|number): RequestHandler {
26
+
27
+ const maxChunkSize = confUtil.stringToNumOfBytes(chunkLimit);
28
+
29
+ return async (req: Request, res, next) => {
30
+
31
+ if (!req.is(BIN_TYPE)) {
32
+ attachByteDrainToRequest(req);
33
+ res.status(ERR_SC.wrongContentType).send(
34
+ `Content-Type must be ${BIN_TYPE} for this call.`
35
+ );
36
+ return;
37
+ }
38
+
39
+ const session = req.session;
40
+ const recipient = session.params.recipient;
41
+ const msgId = session.params.msgId;
42
+
43
+ if (!msgId) {
44
+ res.status(ERR_SC.earlyReq).send(
45
+ "Metadata has not been sent, yet."
46
+ );
47
+ return;
48
+ }
49
+
50
+ const objId: string = req.params.objId;
51
+
52
+ // get and check Content-Length, implicitly sending replies for bad length
53
+ let len = getContentLenOrSendError(req, res, maxChunkSize);
54
+ if (len === undefined) {
55
+ attachByteDrainToRequest(req);
56
+ return;
57
+ }
58
+
59
+ // extract and check query parameters
60
+ const opts = extractQueryOptions(req);
61
+ if (!opts) {
62
+ return replyToMalformed(req, "Bad query parameters", res);
63
+ }
64
+
65
+ if (opts.fstReq) {
66
+ // check options versus chunk length
67
+ if (opts.fstReq.header > len) {
68
+ return replyToMalformed(req, "Bad query parameters", res);
69
+ }
70
+ } else if (opts.sndReq) {
71
+ // check options versus chunk length
72
+ if ((len === 0) && !opts.sndReq.last) {
73
+ return replyToMalformed(req, "No segment bytes", res);
74
+ }
75
+ } else {
76
+ return next(new Error(`This place should not be reachable`));
77
+ }
78
+
79
+ // ensure that it is ok space-wise to save additional bytes
80
+ const allowedSpace =
81
+ (session.params.maxMsgLength - session.params.currentMsgLength);
82
+ if (len <= allowedSpace) {
83
+ session.params.currentMsgLength += len;
84
+ } else {
85
+ res.status(ERR_SC.contentTooLong).send(
86
+ "This request goes over the message limit."
87
+ );
88
+ return;
89
+ }
90
+
91
+ try {
92
+ await saveObjFunc(recipient, msgId, objId, opts.fstReq, opts.sndReq, len, req);
93
+ res.status(api.SC.ok).send();
94
+ } catch (err) {
95
+ session.params.currentMsgLength -= len;
96
+ if ("string" !== typeof err) {
97
+ next(err);
98
+ } else if (err === recipSC.USER_UNKNOWN) {
99
+ res.status(ERR_SC.server).send("Recipient disappeared from the system.");
100
+ session.close();
101
+ } else if (err === recipSC.OBJ_EXIST) {
102
+ res.status(api.SC.objAlreadyExists).send(`Object ${objId} already exists.`);
103
+ } else if (err === recipSC.MSG_UNKNOWN) {
104
+ res.status(ERR_SC.server).send("Message disappeared from the system.");
105
+ session.close();
106
+ } else if (err === recipSC.OBJ_UNKNOWN) {
107
+ res.status(api.SC.unknownObj).send(`Object ${objId} is unknown.`);
108
+ } else if (err === recipSC.WRONG_OBJ_STATE) {
109
+ res.status(ERR_SC.malformed).send(`Object ${objId} is not in a different state.`);
110
+ } else if (err === recipSC.OBJ_FILE_INCOMPLETE) {
111
+ res.status(ERR_SC.objIncomplete).send(`Object ${objId} is not complete.`);
112
+ } else {
113
+ next(new Error(`Unhandled storage error code: ${err}`));
114
+ }
115
+ }
116
+ };
117
+ }
118
+
119
+ function extractQueryOptions(req: Request): undefined|{
120
+ fstReq?: PutObjFirstQueryOpts; sndReq?: PutObjSecondQueryOpts;
121
+ } {
122
+ if ((req.query as any as PutObjFirstQueryOpts).header) {
123
+ // this is the first request
124
+ // query fields are string or undefined, yet, type info helps the show
125
+ const query = req.query as any as PutObjFirstQueryOpts;
126
+
127
+ const header = parseInt(query.header as any);
128
+ if (isNaN(header) || (header < 1)) { return; }
129
+
130
+ const last = ((query.last as any) === 'true');
131
+
132
+ return { fstReq: { header, last } };
133
+
134
+ } else {
135
+ // this is the second (not first) request
136
+ // query fields are string or undefined, yet, type info helps the show
137
+ const query = req.query as any as PutObjSecondQueryOpts;
138
+
139
+ const last = ((query.last as any) === 'true');
140
+
141
+ const ofs = parseInt(query.ofs as any);
142
+ if (isNaN(ofs) || (ofs < 0)) { return; }
143
+
144
+ return { sndReq: { ofs, last } };
145
+
146
+ }
147
+ }
148
+
149
+ function getContentLenOrSendError(req: Request, res: Response, maxChunkSize: number): number|undefined {
150
+ const contentLength = parseInt(req.get(HTTP_HEADER.contentLength)!);
151
+ if (isNaN(contentLength)) {
152
+ res.status(ERR_SC.contentLenMissing).send("Content-Length header is required with proper number.");
153
+ } else if (contentLength > maxChunkSize) {
154
+ res.status(ERR_SC.contentTooLong).send("Request body is too long.");
155
+ } else {
156
+ return contentLength;
157
+ }
158
+ return;
159
+ }
160
+
161
+ function replyToMalformed(req: Request, msg: string, res: Response): void {
162
+ attachByteDrainToRequest(req);
163
+ res.status(ERR_SC.malformed).send(msg);
164
+ }
165
+
166
+ Object.freeze(exports);
@@ -0,0 +1,130 @@
1
+ /*
2
+ Copyright (C) 2017, 2025 3NSoft Inc.
3
+
4
+ This program is free software: you can redistribute it and/or modify it under
5
+ the terms of the GNU General Public License as published by the Free Software
6
+ Foundation, either version 3 of the License, or (at your option) any later
7
+ version.
8
+
9
+ This program is distributed in the hope that it will be useful, but
10
+ WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
+ See the GNU General Public License for more details.
13
+
14
+ You should have received a copy of the GNU General Public License along with
15
+ this program. If not, see <http://www.gnu.org/licenses/>.
16
+ */
17
+
18
+ import { RequestHandler, Response } from 'express';
19
+ import { SC as recipSC, MsgDelivery } from '../../resources/recipients';
20
+ import { sessionRestart as api, ERR_SC, ErrorReply } from '../../../lib-common/service-api/asmail/delivery';
21
+ import { Request, GenerateSession, GetSessionForMsg } from '../../resources/delivery-sessions';
22
+ import { Redirect } from './start-session';
23
+ import { checkAndTransformAddress } from '../../../lib-common/canonical-address';
24
+ import * as confUtil from '../../../lib-server/conf-util';
25
+
26
+ /**
27
+ * This creates a session restart route handler.
28
+ * @param sessionGenFunc is a promise returning function that generates new
29
+ * session objects.
30
+ * @param sessionForMsgFunc is a function that promises existing session for
31
+ * a known message in delivery.
32
+ * @param incompleteMsgFunc is a function that promises parameters of a message
33
+ * that is still in delivery.
34
+ * @param redirectFunc is an optional function that returns a promise,
35
+ * resolvable to
36
+ * (1) string with URI for ASMail service, which is serving given recipient,
37
+ * (2) undefined, if it is this server should service given recipient.
38
+ */
39
+ export function restartSession(
40
+ sessionGenFunc: GenerateSession,sessionForMsgFunc: GetSessionForMsg,
41
+ incompleteMsgFunc: MsgDelivery['incompleteMsgDeliveryParams'],
42
+ maxChunk: string|number, redirectFunc?: Redirect
43
+ ): RequestHandler {
44
+
45
+ const maxChunkSize = confUtil.stringToNumOfBytes(maxChunk);
46
+
47
+ async function serveRequestHere(
48
+ recipient: string, msgId: string, res: Response
49
+ ): Promise<void> {
50
+ let session = await sessionForMsgFunc(recipient, msgId);
51
+ if (!session) {
52
+ const msgParams = await incompleteMsgFunc(recipient, msgId);
53
+ session = await sessionGenFunc();
54
+ session.isAuthorized = true;
55
+ session.params.recipient = recipient;
56
+ session.params.msgId = msgId;
57
+ session.params.currentMsgLength = msgParams.currentMsgLength;
58
+ session.params.maxMsgLength = msgParams.maxMsgLength;
59
+ }
60
+ res.status(api.SC.ok).json( <api.Reply> {
61
+ maxMsgLength: session.params.maxMsgLength,
62
+ sessionId: session.id,
63
+ maxChunkSize
64
+ });
65
+ }
66
+
67
+ return async (req: Request, res, next) => {
68
+
69
+ const rb: api.Request = req.body;
70
+ const recipient = checkAndTransformAddress(rb.recipient);
71
+ const msgId = rb.msgId;
72
+ const session = req.session;
73
+
74
+ // session is opened, and is even mentioned in a header
75
+ if (session) {
76
+ res.status(api.SC.ok).json( <api.Reply> {
77
+ maxMsgLength: session.params.maxMsgLength,
78
+ sessionId: session.id,
79
+ maxChunkSize
80
+ });
81
+ return;
82
+ }
83
+
84
+ // missing recipient makes a bad request
85
+ if (!recipient) {
86
+ res.status(ERR_SC.malformed).json( <ErrorReply> {
87
+ error: "Recipient is either missing in the request, or is malformed"
88
+ });
89
+ return;
90
+ }
91
+
92
+ // check message id
93
+ if (typeof msgId !== 'string') {
94
+ res.status(ERR_SC.malformed).json( <ErrorReply> {
95
+ error: "Message id is either missing, or is malformed"
96
+ });
97
+ return;
98
+ }
99
+
100
+ try {
101
+ if (redirectFunc) {
102
+ const redirectTo = await redirectFunc(recipient);
103
+ if (redirectTo) {
104
+ res.status(api.SC.redirect).json(<api.RedirectReply> {
105
+ redirect: redirectTo
106
+ });
107
+ } else {
108
+ await serveRequestHere(recipient, msgId, res);
109
+ }
110
+ } else {
111
+ await serveRequestHere(recipient, msgId, res);
112
+ }
113
+ } catch (err) {
114
+ if (err === recipSC.USER_UNKNOWN) {
115
+ res.status(api.SC.unknownRecipient).json( <ErrorReply> {
116
+ error: `Recipient ${recipient} is unknown.`
117
+ });
118
+ } else if (err === recipSC.MSG_UNKNOWN) {
119
+ res.status(api.SC.unknownMsg).json( <ErrorReply> {
120
+ error: `Recipient ${recipient} is unknown.`
121
+ });
122
+ } else {
123
+ next(err);
124
+ }
125
+ }
126
+
127
+ };
128
+ }
129
+
130
+ Object.freeze(exports);