spec-3nweb-server 1.8.5 → 1.8.7

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 (340) 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/resources/store.d.ts +2 -2
  6. package/build/3nstorage/resources/store.js +1 -1
  7. package/build/3nstorage/resources/users.d.ts +3 -3
  8. package/build/3nstorage/resources/users.js +1 -1
  9. package/build/3nstorage/resources/utils.d.ts +6 -0
  10. package/build/3nstorage/resources/utils.js +41 -0
  11. package/build/3nstorage/routes/owner/archive-obj-version.js +8 -10
  12. package/build/3nstorage/routes/owner/cancel-trans.js +5 -4
  13. package/build/3nstorage/routes/owner/delete-obj.js +7 -8
  14. package/build/3nstorage/routes/owner/get-archived-obj-ver.js +11 -13
  15. package/build/3nstorage/routes/owner/get-current-obj.js +7 -6
  16. package/build/3nstorage/routes/owner/get-obj-status.js +8 -8
  17. package/build/3nstorage/routes/owner/put-current-obj.js +25 -55
  18. package/build/3nstorage/routes/owner/session-params.js +2 -0
  19. package/build/asmail/resources/utils.d.ts +6 -0
  20. package/build/asmail/resources/utils.js +36 -0
  21. package/build/asmail/routes/delivery/finalize-delivery.js +3 -2
  22. package/build/asmail/routes/delivery/pre-flight.js +9 -26
  23. package/build/asmail/routes/delivery/provide-recipient-pubkey.js +4 -3
  24. package/build/asmail/routes/delivery/put-metadata.js +13 -21
  25. package/build/asmail/routes/delivery/put-obj.js +19 -25
  26. package/build/asmail/routes/delivery/restart-session.d.ts +4 -8
  27. package/build/asmail/routes/delivery/restart-session.js +10 -23
  28. package/build/asmail/routes/delivery/sender-authorization.js +5 -5
  29. package/build/asmail/routes/delivery/start-session.js +9 -24
  30. package/build/asmail/routes/retrieval/get-message-meta.js +4 -7
  31. package/build/asmail/routes/retrieval/get-message-obj.js +10 -7
  32. package/build/asmail/routes/retrieval/list-messages.js +4 -4
  33. package/build/asmail/routes/retrieval/remove-message.js +3 -2
  34. package/build/mock/tls-options.js +46 -44
  35. package/build/tests/admin-proto/signup.d.ts +1 -0
  36. package/build/tests/admin-proto/signup.js +235 -0
  37. package/build/tests/jasmine.d.ts +1 -0
  38. package/build/tests/jasmine.js +32 -0
  39. package/build/tests/libs-for-tests/3nstorage.d.ts +22 -0
  40. package/build/tests/libs-for-tests/3nstorage.js +123 -0
  41. package/build/tests/libs-for-tests/asmail.d.ts +22 -0
  42. package/build/tests/libs-for-tests/asmail.js +179 -0
  43. package/build/tests/libs-for-tests/assert.d.ts +1 -0
  44. package/build/tests/libs-for-tests/assert.js +26 -0
  45. package/build/tests/libs-for-tests/async-jasmine.d.ts +7 -0
  46. package/build/tests/libs-for-tests/async-jasmine.js +77 -0
  47. package/build/tests/libs-for-tests/bytes-equal.d.ts +1 -0
  48. package/build/tests/libs-for-tests/bytes-equal.js +34 -0
  49. package/build/tests/libs-for-tests/json-copy.d.ts +1 -0
  50. package/build/tests/libs-for-tests/json-copy.js +45 -0
  51. package/build/tests/libs-for-tests/json-equal.d.ts +4 -0
  52. package/build/tests/libs-for-tests/json-equal.js +67 -0
  53. package/build/tests/libs-for-tests/mailerid.d.ts +13 -0
  54. package/build/tests/libs-for-tests/mailerid.js +114 -0
  55. package/build/tests/libs-for-tests/pkl.d.ts +28 -0
  56. package/build/tests/libs-for-tests/pkl.js +89 -0
  57. package/build/tests/libs-for-tests/server-components/3nstorage.d.ts +20 -0
  58. package/build/tests/libs-for-tests/server-components/3nstorage.js +200 -0
  59. package/build/tests/libs-for-tests/server-components/admin.d.ts +6 -0
  60. package/build/tests/libs-for-tests/server-components/admin.js +43 -0
  61. package/build/tests/libs-for-tests/server-components/asmail.d.ts +16 -0
  62. package/build/tests/libs-for-tests/server-components/asmail.js +143 -0
  63. package/build/tests/libs-for-tests/server-components/component.d.ts +13 -0
  64. package/build/tests/libs-for-tests/server-components/component.js +77 -0
  65. package/build/tests/libs-for-tests/server-components/mailerid.d.ts +10 -0
  66. package/build/tests/libs-for-tests/server-components/mailerid.js +103 -0
  67. package/build/tests/libs-for-tests/server-runner.d.ts +15 -0
  68. package/build/tests/libs-for-tests/server-runner.js +69 -0
  69. package/build/tests/libs-for-tests/spec-assembly.d.ts +6 -0
  70. package/build/tests/libs-for-tests/spec-assembly.js +55 -0
  71. package/build/tests/libs-for-tests/ws-utils.d.ts +3 -0
  72. package/build/tests/libs-for-tests/ws-utils.js +59 -0
  73. package/build/tests/libs-for-tests/xhr-utils.d.ts +61 -0
  74. package/build/tests/libs-for-tests/xhr-utils.js +154 -0
  75. package/build/tests/protocols/3nstorage/owner/specs/archive-obj-ver.d.ts +2 -0
  76. package/build/tests/protocols/3nstorage/owner/specs/archive-obj-ver.js +84 -0
  77. package/build/tests/protocols/3nstorage/owner/specs/archive-root-ver.d.ts +2 -0
  78. package/build/tests/protocols/3nstorage/owner/specs/archive-root-ver.js +78 -0
  79. package/build/tests/protocols/3nstorage/owner/specs/delete-archive-obj-ver.d.ts +2 -0
  80. package/build/tests/protocols/3nstorage/owner/specs/delete-archive-obj-ver.js +83 -0
  81. package/build/tests/protocols/3nstorage/owner/specs/delete-archive-root-ver.d.ts +2 -0
  82. package/build/tests/protocols/3nstorage/owner/specs/delete-archive-root-ver.js +77 -0
  83. package/build/tests/protocols/3nstorage/owner/specs/delete-obj.d.ts +2 -0
  84. package/build/tests/protocols/3nstorage/owner/specs/delete-obj.js +75 -0
  85. package/build/tests/protocols/3nstorage/owner/specs/events.d.ts +2 -0
  86. package/build/tests/protocols/3nstorage/owner/specs/events.js +91 -0
  87. package/build/tests/protocols/3nstorage/owner/specs/get-current-obj.d.ts +2 -0
  88. package/build/tests/protocols/3nstorage/owner/specs/get-current-obj.js +269 -0
  89. package/build/tests/protocols/3nstorage/owner/specs/get-current-root.d.ts +2 -0
  90. package/build/tests/protocols/3nstorage/owner/specs/get-current-root.js +262 -0
  91. package/build/tests/protocols/3nstorage/owner/specs/get-obj-status.d.ts +2 -0
  92. package/build/tests/protocols/3nstorage/owner/specs/get-obj-status.js +79 -0
  93. package/build/tests/protocols/3nstorage/owner/specs/get-root-status.d.ts +2 -0
  94. package/build/tests/protocols/3nstorage/owner/specs/get-root-status.js +72 -0
  95. package/build/tests/protocols/3nstorage/owner/specs/put-current-obj.d.ts +2 -0
  96. package/build/tests/protocols/3nstorage/owner/specs/put-current-obj.js +287 -0
  97. package/build/tests/protocols/3nstorage/owner/specs/put-current-root.d.ts +2 -0
  98. package/build/tests/protocols/3nstorage/owner/specs/put-current-root.js +274 -0
  99. package/build/tests/protocols/3nstorage/owner/specs/trans-cancel-root.d.ts +2 -0
  100. package/build/tests/protocols/3nstorage/owner/specs/trans-cancel-root.js +73 -0
  101. package/build/tests/protocols/3nstorage/owner/specs/trans-cancel.d.ts +2 -0
  102. package/build/tests/protocols/3nstorage/owner/specs/trans-cancel.js +72 -0
  103. package/build/tests/protocols/3nstorage/owner/test-utils.d.ts +14 -0
  104. package/build/tests/protocols/3nstorage/owner/test-utils.js +54 -0
  105. package/build/tests/protocols/3nstorage/owner.d.ts +1 -0
  106. package/build/tests/protocols/3nstorage/owner.js +138 -0
  107. package/build/tests/protocols/asmail/config.d.ts +1 -0
  108. package/build/tests/protocols/asmail/config.js +117 -0
  109. package/build/tests/protocols/asmail/delivery/specs/finalize-delivery.d.ts +2 -0
  110. package/build/tests/protocols/asmail/delivery/specs/finalize-delivery.js +60 -0
  111. package/build/tests/protocols/asmail/delivery/specs/provide-recipient-pubkey.d.ts +2 -0
  112. package/build/tests/protocols/asmail/delivery/specs/provide-recipient-pubkey.js +68 -0
  113. package/build/tests/protocols/asmail/delivery/specs/put-metadata.d.ts +2 -0
  114. package/build/tests/protocols/asmail/delivery/specs/put-metadata.js +83 -0
  115. package/build/tests/protocols/asmail/delivery/specs/put-obj.d.ts +2 -0
  116. package/build/tests/protocols/asmail/delivery/specs/put-obj.js +123 -0
  117. package/build/tests/protocols/asmail/delivery/specs/restart-session.d.ts +2 -0
  118. package/build/tests/protocols/asmail/delivery/specs/restart-session.js +79 -0
  119. package/build/tests/protocols/asmail/delivery/specs/start-session.d.ts +2 -0
  120. package/build/tests/protocols/asmail/delivery/specs/start-session.js +64 -0
  121. package/build/tests/protocols/asmail/delivery/test-utils.d.ts +16 -0
  122. package/build/tests/protocols/asmail/delivery/test-utils.js +46 -0
  123. package/build/tests/protocols/asmail/delivery.d.ts +1 -0
  124. package/build/tests/protocols/asmail/delivery.js +46 -0
  125. package/build/tests/protocols/asmail/retrieval/specs/events.d.ts +2 -0
  126. package/build/tests/protocols/asmail/retrieval/specs/events.js +62 -0
  127. package/build/tests/protocols/asmail/retrieval/specs/get-message-meta.d.ts +2 -0
  128. package/build/tests/protocols/asmail/retrieval/specs/get-message-meta.js +70 -0
  129. package/build/tests/protocols/asmail/retrieval/specs/get-message-obj.d.ts +2 -0
  130. package/build/tests/protocols/asmail/retrieval/specs/get-message-obj.js +166 -0
  131. package/build/tests/protocols/asmail/retrieval/specs/list-messages.d.ts +2 -0
  132. package/build/tests/protocols/asmail/retrieval/specs/list-messages.js +96 -0
  133. package/build/tests/protocols/asmail/retrieval/specs/remove-message.d.ts +2 -0
  134. package/build/tests/protocols/asmail/retrieval/specs/remove-message.js +66 -0
  135. package/build/tests/protocols/asmail/retrieval/test-utils.d.ts +17 -0
  136. package/build/tests/protocols/asmail/retrieval/test-utils.js +46 -0
  137. package/build/tests/protocols/asmail/retrieval.d.ts +1 -0
  138. package/build/tests/protocols/asmail/retrieval.js +92 -0
  139. package/build/tests/protocols/mailerid.d.ts +1 -0
  140. package/build/tests/protocols/mailerid.js +210 -0
  141. package/build/tests/shared-checks/check-mid-login.d.ts +2 -0
  142. package/build/tests/shared-checks/check-mid-login.js +131 -0
  143. package/build/tests/shared-checks/requests.d.ts +20 -0
  144. package/build/tests/shared-checks/requests.js +123 -0
  145. package/package.json +1 -1
  146. package/packing/create-deb.sh +57 -0
  147. package/packing/deb/lib/systemd/system/3nweb.service +11 -0
  148. package/packing/deb/postinst +44 -0
  149. package/packing/deb/usr/share/doc/3nweb-server/conf-for-postinstall.yaml +19 -0
  150. package/packing/deb/usr/share/doc/3nweb-server/copyright +22 -0
  151. package/publish-task.sh +10 -0
  152. package/push-to-github.sh +105 -0
  153. package/ts-code/3nstorage/3nstorage-app.ts +99 -0
  154. package/ts-code/3nstorage/owner.ts +178 -0
  155. package/ts-code/3nstorage/resources/sessions.ts +37 -0
  156. package/ts-code/3nstorage/resources/store.ts +896 -0
  157. package/ts-code/3nstorage/resources/users.ts +258 -0
  158. package/ts-code/3nstorage/resources/utils.ts +45 -0
  159. package/ts-code/3nstorage/routes/owner/archive-obj-version.ts +71 -0
  160. package/ts-code/3nstorage/routes/owner/cancel-trans.ts +60 -0
  161. package/ts-code/3nstorage/routes/owner/delete-obj.ts +99 -0
  162. package/ts-code/3nstorage/routes/owner/get-archived-obj-ver.ts +109 -0
  163. package/ts-code/3nstorage/routes/owner/get-current-obj.ts +124 -0
  164. package/ts-code/3nstorage/routes/owner/get-obj-status.ts +55 -0
  165. package/ts-code/3nstorage/routes/owner/param-getter.ts +51 -0
  166. package/ts-code/3nstorage/routes/owner/param-setter.ts +50 -0
  167. package/ts-code/3nstorage/routes/owner/put-current-obj.ts +257 -0
  168. package/ts-code/3nstorage/routes/owner/session-params.ts +50 -0
  169. package/ts-code/3nstorage/shared.ts +43 -0
  170. package/ts-code/asmail/asmail-app.ts +91 -0
  171. package/ts-code/asmail/config.ts +96 -0
  172. package/ts-code/asmail/delivery.ts +94 -0
  173. package/ts-code/asmail/resources/delivery-sessions.ts +118 -0
  174. package/ts-code/asmail/resources/inbox.ts +696 -0
  175. package/ts-code/asmail/resources/recipients.ts +495 -0
  176. package/ts-code/asmail/resources/sessions.ts +37 -0
  177. package/ts-code/asmail/resources/utils.ts +41 -0
  178. package/ts-code/asmail/retrieval.ts +96 -0
  179. package/ts-code/asmail/routes/config/param-getter.ts +49 -0
  180. package/ts-code/asmail/routes/config/param-setter.ts +49 -0
  181. package/ts-code/asmail/routes/delivery/finalize-delivery.ts +51 -0
  182. package/ts-code/asmail/routes/delivery/pre-flight.ts +118 -0
  183. package/ts-code/asmail/routes/delivery/provide-recipient-pubkey.ts +58 -0
  184. package/ts-code/asmail/routes/delivery/put-metadata.ts +85 -0
  185. package/ts-code/asmail/routes/delivery/put-obj.ts +152 -0
  186. package/ts-code/asmail/routes/delivery/restart-session.ts +117 -0
  187. package/ts-code/asmail/routes/delivery/sender-authorization.ts +81 -0
  188. package/ts-code/asmail/routes/delivery/start-session.ts +136 -0
  189. package/ts-code/asmail/routes/retrieval/get-message-meta.ts +50 -0
  190. package/ts-code/asmail/routes/retrieval/get-message-obj.ts +106 -0
  191. package/ts-code/asmail/routes/retrieval/list-messages.ts +68 -0
  192. package/ts-code/asmail/routes/retrieval/remove-message.ts +48 -0
  193. package/ts-code/cli/index.ts +82 -0
  194. package/ts-code/cli/run-cmd.ts +81 -0
  195. package/ts-code/cli/show-sample-config.ts +78 -0
  196. package/ts-code/cli/signup-cmd.ts +229 -0
  197. package/ts-code/cli/user-cmd.ts +68 -0
  198. package/ts-code/cli/utils.ts +105 -0
  199. package/ts-code/config/default-confs.ts +22 -0
  200. package/ts-code/config/from-yaml.ts +35 -0
  201. package/ts-code/config/letsencrypt.ts +77 -0
  202. package/ts-code/config/signup.ts +137 -0
  203. package/ts-code/lib-common/admin-api/signup.ts +120 -0
  204. package/ts-code/lib-common/assert.ts +22 -0
  205. package/ts-code/lib-common/async-fs-node.ts +656 -0
  206. package/ts-code/lib-common/buffer-utils.ts +124 -0
  207. package/ts-code/lib-common/byte-streaming/common.ts +166 -0
  208. package/ts-code/lib-common/bytes-equal.ts +25 -0
  209. package/ts-code/lib-common/canonical-address.ts +92 -0
  210. package/ts-code/lib-common/exceptions/error.ts +44 -0
  211. package/ts-code/lib-common/exceptions/file.ts +84 -0
  212. package/ts-code/lib-common/exceptions/http.ts +69 -0
  213. package/ts-code/lib-common/ipc/generic-ipc.ts +750 -0
  214. package/ts-code/lib-common/ipc/ws-ipc.ts +117 -0
  215. package/ts-code/lib-common/json-equal.ts +55 -0
  216. package/ts-code/lib-common/json-utils.ts +130 -0
  217. package/ts-code/lib-common/jwkeys.ts +246 -0
  218. package/ts-code/lib-common/map-of-sets.ts +60 -0
  219. package/ts-code/lib-common/mid-sigs-NaCl-Ed.ts +677 -0
  220. package/ts-code/lib-common/objs-on-disk/file-layout.ts +480 -0
  221. package/ts-code/lib-common/objs-on-disk/obj-file.ts +325 -0
  222. package/ts-code/lib-common/objs-on-disk/utils.ts +201 -0
  223. package/ts-code/lib-common/objs-on-disk/v1-obj-file-format.ts +329 -0
  224. package/ts-code/lib-common/processes.ts +501 -0
  225. package/ts-code/lib-common/random-node.ts +79 -0
  226. package/ts-code/lib-common/service-api/3nstorage/owner.ts +559 -0
  227. package/ts-code/lib-common/service-api/3nstorage/root-route.ts +22 -0
  228. package/ts-code/lib-common/service-api/asmail/config.ts +144 -0
  229. package/ts-code/lib-common/service-api/asmail/delivery.ts +250 -0
  230. package/ts-code/lib-common/service-api/asmail/retrieval.ts +238 -0
  231. package/ts-code/lib-common/service-api/asmail/root-route.ts +22 -0
  232. package/ts-code/lib-common/service-api/ipc-api.ts +44 -0
  233. package/ts-code/lib-common/service-api/locker.ts +44 -0
  234. package/ts-code/lib-common/service-api/mailer-id/login.ts +80 -0
  235. package/ts-code/lib-common/service-api/mailer-id/provisioning.ts +64 -0
  236. package/ts-code/lib-common/service-api/mailer-id/root-route.ts +25 -0
  237. package/ts-code/lib-common/service-api/pub-key-login.ts +75 -0
  238. package/ts-code/lib-common/service-api/web-socket-base.ts +87 -0
  239. package/ts-code/lib-common/session-encryptor.ts +54 -0
  240. package/ts-code/lib-common/time-window-cache.ts +74 -0
  241. package/ts-code/lib-common/transferable.d.ts +30 -0
  242. package/ts-code/lib-server/conf-util.ts +35 -0
  243. package/ts-code/lib-server/mid-access.ts +45 -0
  244. package/ts-code/lib-server/middleware/body-parsers.ts +248 -0
  245. package/ts-code/lib-server/middleware/error-handler.ts +79 -0
  246. package/ts-code/lib-server/pkl-access.ts +46 -0
  247. package/ts-code/lib-server/resources/dns.ts +151 -0
  248. package/ts-code/lib-server/resources/mailerid-authorizer.ts +115 -0
  249. package/ts-code/lib-server/resources/mem-backed-sessions-factory.ts +132 -0
  250. package/ts-code/lib-server/resources/server-data-folders.ts +160 -0
  251. package/ts-code/lib-server/resources/server-key-for-pkl-challenge.ts +41 -0
  252. package/ts-code/lib-server/resources/sessions.ts +232 -0
  253. package/ts-code/lib-server/resources/user-files.ts +147 -0
  254. package/ts-code/lib-server/routes/pub-key-login/complete-exchange.ts +63 -0
  255. package/ts-code/lib-server/routes/pub-key-login/start-exchange.ts +189 -0
  256. package/ts-code/lib-server/routes/sessions/close.ts +27 -0
  257. package/ts-code/lib-server/routes/sessions/mid-auth.ts +77 -0
  258. package/ts-code/lib-server/routes/sessions/start.ts +116 -0
  259. package/ts-code/lib-server/web-sockets/app.ts +339 -0
  260. package/ts-code/lib-server/web-sockets/server-events.ts +63 -0
  261. package/ts-code/lib.ts +29 -0
  262. package/ts-code/locker/locker-app.ts +60 -0
  263. package/ts-code/locker/resources/lockers.ts +17 -0
  264. package/ts-code/locker/resources/sessions.ts +37 -0
  265. package/ts-code/locker/routes/create-locker.ts +47 -0
  266. package/ts-code/mailerId/mailerId-app.ts +107 -0
  267. package/ts-code/mailerId/resources/certifier.ts +181 -0
  268. package/ts-code/mailerId/resources/sessions.ts +44 -0
  269. package/ts-code/mailerId/resources/users.ts +88 -0
  270. package/ts-code/mailerId/routes/certify.ts +68 -0
  271. package/ts-code/main.ts +304 -0
  272. package/ts-code/mock/dns.ts +106 -0
  273. package/ts-code/mock/mock-as-child-proc.ts +130 -0
  274. package/ts-code/mock/node-child-ipc.ts +69 -0
  275. package/ts-code/mock/run-in-proc.ts +111 -0
  276. package/ts-code/mock/tls-options.ts +73 -0
  277. package/ts-code/services.ts +138 -0
  278. package/ts-code/signup/resources/users.ts +429 -0
  279. package/ts-code/signup/routes/add.ts +65 -0
  280. package/ts-code/signup/routes/get-available-addresses.ts +49 -0
  281. package/ts-code/signup/routes/get-available-domains.ts +45 -0
  282. package/ts-code/signup/signup-app.ts +54 -0
  283. package/ts-code/signup/signup-tokens.ts +148 -0
  284. package/ts-code/tests/admin-proto/signup.ts +277 -0
  285. package/ts-code/tests/jasmine.ts +37 -0
  286. package/ts-code/tests/libs-for-tests/3nstorage.ts +144 -0
  287. package/ts-code/tests/libs-for-tests/asmail.ts +220 -0
  288. package/ts-code/tests/libs-for-tests/assert.ts +22 -0
  289. package/ts-code/tests/libs-for-tests/async-jasmine.ts +89 -0
  290. package/ts-code/tests/libs-for-tests/bytes-equal.ts +25 -0
  291. package/ts-code/tests/libs-for-tests/json-copy.ts +38 -0
  292. package/ts-code/tests/libs-for-tests/json-equal.ts +55 -0
  293. package/ts-code/tests/libs-for-tests/mailerid.ts +123 -0
  294. package/ts-code/tests/libs-for-tests/pkl.ts +127 -0
  295. package/ts-code/tests/libs-for-tests/server-components/3nstorage.ts +206 -0
  296. package/ts-code/tests/libs-for-tests/server-components/admin.ts +49 -0
  297. package/ts-code/tests/libs-for-tests/server-components/asmail.ts +152 -0
  298. package/ts-code/tests/libs-for-tests/server-components/component.ts +90 -0
  299. package/ts-code/tests/libs-for-tests/server-components/mailerid.ts +114 -0
  300. package/ts-code/tests/libs-for-tests/server-runner.ts +82 -0
  301. package/ts-code/tests/libs-for-tests/spec-assembly.ts +60 -0
  302. package/ts-code/tests/libs-for-tests/ws-utils.ts +61 -0
  303. package/ts-code/tests/libs-for-tests/xhr-utils.ts +179 -0
  304. package/ts-code/tests/protocols/3nstorage/owner/specs/archive-obj-ver.ts +100 -0
  305. package/ts-code/tests/protocols/3nstorage/owner/specs/archive-root-ver.ts +91 -0
  306. package/ts-code/tests/protocols/3nstorage/owner/specs/delete-archive-obj-ver.ts +99 -0
  307. package/ts-code/tests/protocols/3nstorage/owner/specs/delete-archive-root-ver.ts +90 -0
  308. package/ts-code/tests/protocols/3nstorage/owner/specs/delete-obj.ts +84 -0
  309. package/ts-code/tests/protocols/3nstorage/owner/specs/events.ts +125 -0
  310. package/ts-code/tests/protocols/3nstorage/owner/specs/get-current-obj.ts +298 -0
  311. package/ts-code/tests/protocols/3nstorage/owner/specs/get-current-root.ts +290 -0
  312. package/ts-code/tests/protocols/3nstorage/owner/specs/get-obj-status.ts +88 -0
  313. package/ts-code/tests/protocols/3nstorage/owner/specs/get-root-status.ts +80 -0
  314. package/ts-code/tests/protocols/3nstorage/owner/specs/put-current-obj.ts +366 -0
  315. package/ts-code/tests/protocols/3nstorage/owner/specs/put-current-root.ts +329 -0
  316. package/ts-code/tests/protocols/3nstorage/owner/specs/trans-cancel-root.ts +86 -0
  317. package/ts-code/tests/protocols/3nstorage/owner/specs/trans-cancel.ts +86 -0
  318. package/ts-code/tests/protocols/3nstorage/owner/test-utils.ts +72 -0
  319. package/ts-code/tests/protocols/3nstorage/owner.ts +198 -0
  320. package/ts-code/tests/protocols/asmail/config.ts +172 -0
  321. package/ts-code/tests/protocols/asmail/delivery/specs/finalize-delivery.ts +69 -0
  322. package/ts-code/tests/protocols/asmail/delivery/specs/provide-recipient-pubkey.ts +88 -0
  323. package/ts-code/tests/protocols/asmail/delivery/specs/put-metadata.ts +102 -0
  324. package/ts-code/tests/protocols/asmail/delivery/specs/put-obj.ts +156 -0
  325. package/ts-code/tests/protocols/asmail/delivery/specs/restart-session.ts +97 -0
  326. package/ts-code/tests/protocols/asmail/delivery/specs/start-session.ts +79 -0
  327. package/ts-code/tests/protocols/asmail/delivery/test-utils.ts +64 -0
  328. package/ts-code/tests/protocols/asmail/delivery.ts +56 -0
  329. package/ts-code/tests/protocols/asmail/retrieval/specs/events.ts +78 -0
  330. package/ts-code/tests/protocols/asmail/retrieval/specs/get-message-meta.ts +80 -0
  331. package/ts-code/tests/protocols/asmail/retrieval/specs/get-message-obj.ts +197 -0
  332. package/ts-code/tests/protocols/asmail/retrieval/specs/list-messages.ts +110 -0
  333. package/ts-code/tests/protocols/asmail/retrieval/specs/remove-message.ts +74 -0
  334. package/ts-code/tests/protocols/asmail/retrieval/test-utils.ts +60 -0
  335. package/ts-code/tests/protocols/asmail/retrieval.ts +115 -0
  336. package/ts-code/tests/protocols/mailerid.ts +271 -0
  337. package/ts-code/tests/shared-checks/check-mid-login.ts +164 -0
  338. package/ts-code/tests/shared-checks/requests.ts +135 -0
  339. package/ts-code/tsconfig.json +11 -0
  340. package/ts-code/web3n.d.ts +1068 -0
@@ -0,0 +1,181 @@
1
+ /*
2
+ Copyright (C) 2015 - 2016 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 { signing } from 'ecma-nacl';
19
+ import { relyingParty as midRP, idProvider as midIdP, KEY_USE } from '../../lib-common/mid-sigs-NaCl-Ed';
20
+ import { getKeyCert, JsonKey, SignedLoad, keyFromJson } from '../../lib-common/jwkeys';
21
+ import * as random from '../../lib-common/random-node';
22
+ import { readFileSync, writeFileSync } from 'fs';
23
+ import { FileException, Code as excCode } from '../../lib-common/exceptions/file';
24
+
25
+ export const ROOT_CERT_VALIDITY = 365*24*60*60;
26
+ export const PROVIDER_CERT_VALIDITY = 10*24*60*60;
27
+ export const MAX_USER_CERT_VALIDITY = 24*60*60;
28
+
29
+ export interface RootCerts {
30
+ current: SignedLoad;
31
+ previous: SignedLoad[];
32
+ }
33
+
34
+ interface LogFn {
35
+ (msg: string): void;
36
+ }
37
+
38
+ function loadOrGenerateRootCert(
39
+ domain: string, path: string
40
+ ): { certs: RootCerts; skey: JsonKey; } {
41
+ let certsAndKey: { certs: RootCerts; skey: JsonKey; };
42
+ try {
43
+ certsAndKey = JSON.parse(
44
+ readFileSync(path, { encoding: 'utf8', flag: 'r' }));
45
+ } catch (err) {
46
+ if ((<FileException> err).code === excCode.notFound) {
47
+ return createFirstCert(domain, path);
48
+ } else {
49
+ throw err;
50
+ }
51
+ }
52
+ const certDomain = getKeyCert(certsAndKey.certs.current).issuer;
53
+ if (certDomain !== domain) {
54
+ throw new Error('Give domain '+domain+
55
+ ' does not equal domain in certificates file: '+certDomain);
56
+ }
57
+ try {
58
+ const pkeyBytes = signing.extract_pkey(keyFromJson(
59
+ certsAndKey.skey, KEY_USE.ROOT, signing.JWK_ALG_NAME,
60
+ signing.SECRET_KEY_LENGTH).k);
61
+ const rootPKey = {
62
+ k: pkeyBytes,
63
+ kid: certsAndKey.skey.kid,
64
+ alg: certsAndKey.skey.alg,
65
+ use: certsAndKey.skey.use
66
+ };
67
+ midRP.verifyKeyCert(certsAndKey.certs.current, domain,
68
+ rootPKey, Math.floor(Date.now()/1000)+PROVIDER_CERT_VALIDITY);
69
+ return certsAndKey;
70
+ } catch (err) {
71
+ return updateCert(domain, path, certsAndKey.certs);
72
+ }
73
+ }
74
+
75
+ function createFirstCert(
76
+ domain: string, path: string, log?: LogFn
77
+ ): { certs: RootCerts; skey: JsonKey; } {
78
+ if (log) { log("\nMailerId service: Creating and saving new root certificate."); }
79
+ const root = midIdP.generateRootKey(
80
+ domain, ROOT_CERT_VALIDITY, random.bytesSync);
81
+ const toSave = {
82
+ skey: root.skey,
83
+ certs: {
84
+ current: root.cert,
85
+ previous: []
86
+ }
87
+ };
88
+ writeFileSync(path, JSON.stringify(toSave),
89
+ { encoding: 'utf8', flag: 'wx' });
90
+ return toSave;
91
+ }
92
+
93
+ function updateCert(
94
+ domain: string, path: string, certs: RootCerts, log?: LogFn
95
+ ): { certs: RootCerts; skey: JsonKey; } {
96
+ if (log) { log("\nMailerId service: Updating root certificate."); }
97
+ const root = midIdP.generateRootKey(
98
+ domain, ROOT_CERT_VALIDITY, random.bytesSync);
99
+ const toSave = {
100
+ skey: root.skey,
101
+ certs: {
102
+ current: root.cert,
103
+ previous: [ certs.current ].concat(certs.previous)
104
+ }
105
+ };
106
+ writeFileSync(path, JSON.stringify(toSave),
107
+ { encoding: 'utf8', flag: 'w' });
108
+ return toSave;
109
+ }
110
+
111
+ export type ICertify = (
112
+ userPKey: JsonKey, address: string, validFor?: number
113
+ ) => { userCert: SignedLoad; provCert: SignedLoad; };
114
+ export interface Certifier {
115
+ certify: ICertify;
116
+ getRootCert(): SignedLoad;
117
+ getPrevCerts(): SignedLoad[];
118
+ }
119
+
120
+ const UPDATE_PERIOD = 8*60*60;
121
+
122
+ if (UPDATE_PERIOD >= PROVIDER_CERT_VALIDITY) {
123
+ throw new Error('Either provider certificate validity is to too short, '+
124
+ 'or an update period is too long.');
125
+ }
126
+
127
+ export function makeSingleProcCertifier(
128
+ domain: string, certsPath: string
129
+ ): Certifier {
130
+
131
+ let rootCerts: RootCerts;
132
+ let certifier: midIdP.IdProviderCertifier;
133
+ let provCert: SignedLoad;
134
+ let updateTime: number;
135
+
136
+ function updateCertifier(): void {
137
+ if (certifier) {
138
+ if (updateTime > Date.now()) { return; }
139
+ certifier.destroy();
140
+ }
141
+
142
+ let certsAndKey = loadOrGenerateRootCert(domain, certsPath);
143
+ rootCerts = certsAndKey.certs;
144
+
145
+ const provider = midIdP.generateProviderKey(
146
+ domain, PROVIDER_CERT_VALIDITY, certsAndKey.skey, random.bytesSync);
147
+ certsAndKey = (undefined as any);
148
+
149
+ provCert = provider.cert;
150
+ Object.freeze(provCert);
151
+
152
+ certifier = midIdP.makeIdProviderCertifier(
153
+ domain, MAX_USER_CERT_VALIDITY, provider.skey);
154
+
155
+ updateTime = (getKeyCert(provCert).expiresAt - 2*UPDATE_PERIOD)*1000;
156
+ }
157
+
158
+ updateCertifier();
159
+ const timer: NodeJS.Timer = <any> setInterval(
160
+ updateCertifier, UPDATE_PERIOD*1000);
161
+ timer.unref();
162
+
163
+ const fact: Certifier = {
164
+ certify: (userPKey, address, validFor) => {
165
+ return {
166
+ userCert: certifier.certify(userPKey, address, validFor),
167
+ provCert: provCert
168
+ };
169
+ },
170
+ getRootCert: () => {
171
+ return rootCerts.current;
172
+ },
173
+ getPrevCerts: () => {
174
+ return rootCerts.previous;
175
+ }
176
+ };
177
+ Object.freeze(fact);
178
+ return fact;
179
+ }
180
+
181
+ Object.freeze(exports);
@@ -0,0 +1,44 @@
1
+ /*
2
+ Copyright (C) 2017 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 { InMemorySessions } from '../../lib-server/resources/mem-backed-sessions-factory';
19
+ import { Factory } from '../../lib-server/resources/sessions';
20
+ import { SessionParams } from '../../lib-server/routes/pub-key-login/start-exchange';
21
+ export { Request } from '../../lib-server/routes/pub-key-login/start-exchange';
22
+
23
+
24
+ export type SessionsFactory = Factory<SessionParams>;
25
+
26
+ function makeSessionParams(): SessionParams {
27
+ return {
28
+ userId: (undefined as any),
29
+ encryptor: (undefined as any),
30
+ serverVerificationBytes: (undefined as any),
31
+ sessionKey: (undefined as any)
32
+ };
33
+ }
34
+
35
+ /**
36
+ * This returns factory, that works properly in a single process application,
37
+ * clearing up sessions that past given timeout.
38
+ * @param timeout is a session timeout in seconds
39
+ */
40
+ export function makeSessionFactory(timeout: number): SessionsFactory {
41
+ return InMemorySessions.factory<SessionParams>(timeout, makeSessionParams);
42
+ }
43
+
44
+ Object.freeze(exports);
@@ -0,0 +1,88 @@
1
+ /*
2
+ Copyright (C) 2015 - 2016, 2020 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
+ /**
19
+ * This module is constructs users factories for MailerId app.
20
+ */
21
+
22
+ import { readFile, FileException } from '../../lib-common/async-fs-node';
23
+ import { box } from 'ecma-nacl';
24
+ import { JsonKey, keyFromJson } from '../../lib-common/jwkeys';
25
+ import { GetUserPKeyAndKeyGenParams, UserPKeyAndKeyGenParams } from '../../lib-server/routes/pub-key-login/start-exchange';
26
+ import { UserMidParams } from '../../lib-common/admin-api/signup';
27
+ import { join } from 'path';
28
+ import { userDataInRootFolder } from '../../lib-server/resources/server-data-folders';
29
+
30
+ export interface Factory {
31
+ getUserParamsAndKey: GetUserPKeyAndKeyGenParams;
32
+ }
33
+
34
+ async function getUser(
35
+ rootFolder: string, userId: string
36
+ ): Promise<UserMidParams|undefined> {
37
+ try {
38
+ const userFolder = userDataInRootFolder(rootFolder, userId);
39
+ const midParamsPath = join(userFolder, 'info', 'mid-params');
40
+ const str = await readFile(midParamsPath, { encoding: 'utf8' });
41
+ return JSON.parse(str) as UserMidParams;
42
+ } catch (exc) {
43
+ if ((exc as FileException).notFound) {
44
+ return;
45
+ }
46
+ throw exc;
47
+ }
48
+ }
49
+
50
+ const MID_KEY_USE = 'login-pub-key';
51
+
52
+ function extractPKeyBytes(pkey: JsonKey): Uint8Array {
53
+ return keyFromJson(pkey, MID_KEY_USE,
54
+ box.JWK_ALG_NAME, box.KEY_LENGTH).k;
55
+ }
56
+
57
+ export function makeFactory(rootFolder: string): Factory {
58
+
59
+ const factory: Factory = {
60
+
61
+ getUserParamsAndKey: async (userId, kid) => {
62
+ const userInfo = await getUser(rootFolder, userId);
63
+ if (!userInfo) { return; }
64
+ let params: UserPKeyAndKeyGenParams;
65
+ if (typeof kid === 'string') {
66
+ const pkey = userInfo.otherPKeys.find((pkey) => {
67
+ return (pkey.kid === kid);
68
+ });
69
+ if (!pkey) { return; }
70
+ params = {
71
+ pkey: extractPKeyBytes(pkey),
72
+ };
73
+ } else {
74
+ params = {
75
+ pkey: extractPKeyBytes(userInfo.defaultPKey.pkey),
76
+ params: userInfo.defaultPKey.kdParams
77
+ };
78
+ }
79
+ return params;
80
+ }
81
+
82
+ };
83
+ Object.freeze(factory);
84
+
85
+ return factory;
86
+ }
87
+
88
+ Object.freeze(exports);
@@ -0,0 +1,68 @@
1
+ /*
2
+ Copyright (C) 2015 - 2016 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, NextFunction } from 'express';
19
+ import { utf8, toBuffer } from '../../lib-common/buffer-utils';
20
+ import { ICertify } from '../resources/certifier';
21
+ import { Request } from '../resources/sessions';
22
+ import { certify as api } from '../../lib-common/service-api/mailer-id/provisioning';
23
+
24
+ export function certify(certifyingFunc: ICertify): RequestHandler {
25
+ if ('function' !== typeof certifyingFunc) { throw new TypeError(
26
+ "Given argument 'certifyingFunc' must be function, but is not."); }
27
+
28
+ return function (req: Request, res: Response, next: NextFunction) {
29
+ const session = req.session;
30
+ const c = new Uint8Array(req.body);
31
+ const encryptor = session.params.encryptor;
32
+ const email = session.params.userId;
33
+ let bodyBytes: Uint8Array;
34
+
35
+ // decrypt request body
36
+ try {
37
+ bodyBytes = encryptor.open(c);
38
+ } catch (err) {
39
+ session.close();
40
+ res.status(api.SC.cryptoVerifFail).send(
41
+ 'Bytes fail cryptographic verification.');
42
+ return;
43
+ }
44
+
45
+ let signedCerts: api.Reply;
46
+
47
+ // extract parameters and certify
48
+ try {
49
+ const reqParams: api.Request =
50
+ JSON.parse(utf8.open(bodyBytes));
51
+ if (!reqParams.pkey) { throw new Error("Missing field"); }
52
+ signedCerts = certifyingFunc(
53
+ reqParams.pkey, email, reqParams.duration);
54
+ } catch (err) {
55
+ session.close();
56
+ res.status(api.SC.malformed).send(
57
+ 'Missing or incorrectly formatted payload.');
58
+ return;
59
+ }
60
+
61
+ res.status(api.SC.ok).send(
62
+ toBuffer(encryptor.pack(utf8.pack(JSON.stringify(signedCerts)))));
63
+ session.close();
64
+
65
+ };
66
+ }
67
+
68
+ Object.freeze(exports);
@@ -0,0 +1,304 @@
1
+ #!/usr/bin/env node
2
+
3
+ /*
4
+ Copyright (C) 2015 - 2016, 2019, 2025 3NSoft Inc.
5
+
6
+ This program is free software: you can redistribute it and/or modify it under
7
+ the terms of the GNU General Public License as published by the Free Software
8
+ Foundation, either version 3 of the License, or (at your option) any later
9
+ version.
10
+
11
+ This program is distributed in the hope that it will be useful, but
12
+ WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14
+ See the GNU General Public License for more details.
15
+
16
+ You should have received a copy of the GNU General Public License along with
17
+ this program. If not, see <http://www.gnu.org/licenses/>.
18
+ */
19
+
20
+ /*
21
+ * This script starts server, according to settings, given in config file.
22
+ */
23
+
24
+ import { ServerOptions } from 'https';
25
+ import { CliUsageDisplay, parseProcessArgv } from './cli';
26
+ import { readYamlConfFile } from './config/from-yaml';
27
+ import { sslOptsFromConfig } from './config/letsencrypt';
28
+ import { Configurations, servicesApp, accountsApp, AppWithWSs } from './lib';
29
+ import { addMultiDomainSignup, addSingleUserSignup, readAllSignupTokens, readNoTokensFile, readTokenFile } from './config/signup';
30
+ import { DEFAULT_CONFIG_PATH } from './config/default-confs';
31
+ import { Code } from './lib-common/exceptions/file';
32
+
33
+ async function run(conf: Configurations): Promise<void> {
34
+
35
+ if (!conf.servicesConnect) {
36
+ console.error(`❌ No connection settings found in configuration.`);
37
+ process.exit(-1);
38
+ return;
39
+ }
40
+
41
+ let app: AppWithWSs|undefined = undefined;
42
+
43
+ function createApp(conf: Configurations): AppWithWSs {
44
+ const app = new AppWithWSs();
45
+ app.use(servicesApp(conf, 'console', 'console'));
46
+ app.use(accountsApp(conf, 'console', 'console'));
47
+ return app;
48
+ }
49
+
50
+ async function stopProcess() {
51
+ if (!app) { return; }
52
+ try {
53
+ console.log(`🏁 Stopping app ...`);
54
+ await app.stop();
55
+ console.log(`app has stopped.`);
56
+ } catch (err) {
57
+ console.log(`app encounter an error, when stopping`);
58
+ console.error(err);
59
+ } finally {
60
+ app = undefined;
61
+ }
62
+ }
63
+
64
+ async function startAppWithTLS(
65
+ sslOpts: ServerOptions, port: number, hostname: string|undefined
66
+ ): Promise<void> {
67
+ await app!.start(sslOpts, port, hostname);
68
+ console.log(`🚀 Started 3NWeb server on port ${port},${hostname ? ` hostname ${hostname},` : ''} with TLS.`);
69
+ }
70
+
71
+ async function startAppWithoutTLS(
72
+ port: number, hostname: string|undefined
73
+ ): Promise<void> {
74
+ await app!.start(undefined, port, hostname);
75
+ console.log(`🚀 Started 3NWeb server on port ${port},${hostname ? ` hostname ${hostname},` : ''} without TLS, and requiring TLS reverse proxy infront.`);
76
+ }
77
+
78
+ try {
79
+
80
+ app = createApp(conf);
81
+
82
+ const {
83
+ hostname, port, letsencrypt, sslOpts, skipReloadOnCertsChange
84
+ } = conf.servicesConnect;
85
+ const tls = sslOptsFromConfig(
86
+ letsencrypt, sslOpts, skipReloadOnCertsChange
87
+ );
88
+ if (tls) {
89
+ await startAppWithTLS(tls.sslOpts, port, hostname);
90
+ if (!skipReloadOnCertsChange) {
91
+ tls.onCertsUpdate!(async (newOpts, originalOpts) => {
92
+ console.log(`🗘 Reloading server app server on TLS certificates change`);
93
+ try {
94
+ await stopProcess();
95
+ app = createApp(conf);
96
+ await startAppWithTLS(newOpts, port, hostname);
97
+ } catch (err) {
98
+ console.error(err);
99
+ console.log(`⚠️ Failed to reload with new TLS certs. Attempting to load with original ones.`);
100
+ try {
101
+ await stopProcess();
102
+ app = createApp(conf);
103
+ await startAppWithTLS(originalOpts, port, hostname);
104
+ } catch (err) {
105
+ await stopProcess();
106
+ console.error(err);
107
+ process.exit(-500);
108
+ }
109
+ }
110
+ });
111
+ }
112
+ } else {
113
+ await startAppWithoutTLS(port, hostname);
114
+ }
115
+
116
+ process.on('SIGINT', stopProcess);
117
+ process.on('SIGTERM', stopProcess);
118
+
119
+ } catch (err) {
120
+ await stopProcess();
121
+ console.error(err);
122
+ process.exit(-500);
123
+ }
124
+ }
125
+
126
+ function showUsage({ txtToDisplay, exitStatus }: CliUsageDisplay): void {
127
+ if (exitStatus === 0) {
128
+ console.log(txtToDisplay);
129
+ } else {
130
+ console.error(txtToDisplay);
131
+ }
132
+ process.exit(exitStatus);
133
+ }
134
+
135
+ function assembleConfig(configPath: string|undefined): Configurations {
136
+ if (!configPath) {
137
+ configPath = DEFAULT_CONFIG_PATH;
138
+ console.log(`Looking for configuration in default location: ${configPath}`);
139
+ }
140
+ try {
141
+ return readYamlConfFile(configPath);
142
+ } catch (err) {
143
+ if (err.code === Code.notFound) {
144
+ console.error(`❌ Configuration file ${configPath} is not found.`);
145
+ process.exit(-2);
146
+ }
147
+ throw err;
148
+ }
149
+ }
150
+
151
+ async function displaySignupInfo(conf: Configurations): Promise<void> {
152
+ if (!conf.signup) {
153
+ console.log(`\nSignup is disabled.\n`);
154
+ } else {
155
+ console.log(`\nSignup is enabled.\n`);
156
+ if (conf.signup.noTokenFile) {
157
+ const ctx = await readNoTokensFile(conf.signup.noTokenFile);
158
+ console.log(`Signup of user without token is allowed in domains:\n`, ctx.domains, `\n`);
159
+ const signupLink = signupLinkFrom(conf, undefined);
160
+ if (signupLink) {
161
+ console.log(`Signup link:\n`, signupLink, `\n`);
162
+ }
163
+ } else {
164
+ console.log(`Signup of users is allowed only with valid signup tokens.\n`);
165
+ }
166
+ if (conf.signup.serviceUrl) {
167
+ console.log(`Signup service url (from configuration file):\n`, conf.signup.serviceUrl, `\n`);
168
+ }
169
+ }
170
+ const {
171
+ multiUserTokens, singleUserTokens
172
+ } = await readAllSignupTokens(conf.rootFolder);
173
+ console.log(`There are ${multiUserTokens.length} multi-user tokens.\n`);
174
+ console.log(`There are ${singleUserTokens.length} single-user tokens.\n`);
175
+ }
176
+
177
+ async function displayTokensList(conf: Configurations): Promise<void> {
178
+ const {
179
+ multiUserTokens, singleUserTokens
180
+ } = await readAllSignupTokens(conf.rootFolder);
181
+ if (multiUserTokens.length > 0) {
182
+ console.log(`\nMulti-user signup tokens:`);
183
+ for (const { tokenId, ctx: { domains } } of multiUserTokens) {
184
+ console.log(` id: ${tokenId} -> domains:`, domains);
185
+ }
186
+ console.log(``);
187
+ } else {
188
+ console.log(`\nThere are no multi-user signup tokens.\n`);
189
+ }
190
+ if (singleUserTokens.length > 0) {
191
+ console.log(`Single-user signup tokens:`);
192
+ for (const { tokenId, ctx: { userId } } of singleUserTokens) {
193
+ console.log(` id: ${tokenId} -> user: ${userId}`);
194
+ }
195
+ console.log(``);
196
+ } else {
197
+ console.log(`There are no single-user signup tokens.\n`);
198
+ }
199
+ }
200
+
201
+ async function displayTokenValue(
202
+ conf: Configurations, tokenId: string
203
+ ): Promise<void> {
204
+ const ctx = await readTokenFile(conf.rootFolder, tokenId);
205
+ if (ctx) {
206
+ const signupLink = signupLinkFrom(conf, ctx.token);
207
+ if (signupLink) {
208
+ console.log(`\nSignup link:\n ${signupLink}`);
209
+ }
210
+ if (ctx.type === 'multi-domain') {
211
+ console.log(`\nMulti-user signup context:`);
212
+ console.log(` domains:`, ctx.domains);
213
+ console.log(` value:`, ctx.token);
214
+ if (ctx.validTill) {
215
+ console.log(` valid till: ${(new Date(ctx.validTill)).toString()}`);
216
+ }
217
+ } else if (ctx.type === 'single-user') {
218
+ console.log(`\nSingle-user signup context:`);
219
+ console.log(` address: `, ctx.userId);
220
+ console.log(` value: `, ctx.token);
221
+ if (ctx.validTill) {
222
+ console.log(` valid till: ${(new Date(ctx.validTill)).toString()}`);
223
+ }
224
+ }
225
+ console.log(``);
226
+ } else {
227
+ console.error(`Token ${tokenId} is not found.`);
228
+ process.exit(-1);
229
+ }
230
+ }
231
+
232
+ const signupLinkStart = `w3n://signup/`;
233
+
234
+ function signupLinkFrom(conf: Configurations, token = ''): string|undefined {
235
+ if (!conf.signup?.serviceUrl) {
236
+ return;
237
+ }
238
+ try {
239
+ const url = new URL(conf.signup.serviceUrl);
240
+ return `${signupLinkStart}${url.host}${url.pathname}${url.pathname.endsWith('/') ? '' : '/'}${token}`;
241
+ } catch (err) {
242
+ return;
243
+ }
244
+ }
245
+
246
+ async function createMultiUserToken(
247
+ conf: Configurations, domains: string[]
248
+ ): Promise<void> {
249
+ const token = await addMultiDomainSignup(conf.rootFolder, domains);
250
+ console.log (`\nFor creating users on domain${(domains.length > 0) ? 's' : ''} ${domains.join(', ')}:\n token value: ${token}`);
251
+ const signupLink = signupLinkFrom(conf, token);
252
+ if (signupLink) {
253
+ console.log(`Signup link:\n ${signupLink}\n`);
254
+ }
255
+ console.log(``);
256
+ }
257
+
258
+ async function createSingleUserToken(
259
+ conf: Configurations, userId: string
260
+ ): Promise<void> {
261
+ const token = await addSingleUserSignup(conf.rootFolder, userId);
262
+ console.log (`\nFor creating user ${userId}:\n token value: ${token}`);
263
+ const signupLink = signupLinkFrom(conf, token);
264
+ if (signupLink) {
265
+ console.log(`Signup link:\n ${signupLink}\n`);
266
+ }
267
+ console.log(``);
268
+ }
269
+
270
+ const cmd = parseProcessArgv();
271
+
272
+ if (cmd.runCmd) {
273
+ const conf = assembleConfig(cmd.runCmd.config!);
274
+ run(conf);
275
+ } else if (cmd.signupCmd) {
276
+ const conf = assembleConfig(cmd.signupCmd.config!);
277
+ if (cmd.signupCmd.info) {
278
+ displaySignupInfo(conf);
279
+ } else if (cmd.signupCmd.listTokens) {
280
+ displayTokensList(conf);
281
+ } else if (cmd.signupCmd.showToken) {
282
+ displayTokenValue(conf, cmd.signupCmd.token!);
283
+ } else if (cmd.signupCmd.createToken) {
284
+ if (cmd.signupCmd.user) {
285
+ createSingleUserToken(conf, cmd.signupCmd.user!);
286
+ } else {
287
+ createMultiUserToken(conf, cmd.signupCmd.domain!);
288
+ }
289
+ } else {
290
+ showUsage({
291
+ txtToDisplay: `❌ No recognized subcommand given to signup module`,
292
+ exitStatus: -1
293
+ });
294
+ }
295
+ } else if (cmd.showSampleConfig) {
296
+ showUsage(cmd.showSampleConfig);
297
+ } else if (cmd.showUsage) {
298
+ showUsage(cmd.showUsage);
299
+ } else {
300
+ showUsage({
301
+ txtToDisplay: `❌ No recognized command given`,
302
+ exitStatus: -1
303
+ });
304
+ }