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.
- package/.gitlab-ci-linux.yml +50 -0
- package/.gitlab-ci-mac.yml +29 -0
- package/.gitlab-ci-windows.yml +29 -0
- package/.gitlab-ci.yml +63 -0
- package/build/3nstorage/routes/owner/archive-obj-version.js +2 -2
- package/build/3nstorage/routes/owner/cancel-trans.js +2 -2
- package/build/3nstorage/routes/owner/delete-obj.js +2 -2
- package/build/3nstorage/routes/owner/get-current-obj.js +3 -4
- package/build/3nstorage/routes/owner/param-setter.js +2 -6
- package/build/asmail/routes/config/param-setter.js +2 -2
- package/build/asmail/routes/delivery/finalize-delivery.js +2 -2
- package/build/asmail/routes/delivery/put-obj.js +2 -2
- package/build/asmail/routes/delivery/sender-authorization.js +2 -2
- package/build/asmail/routes/retrieval/remove-message.js +2 -2
- package/build/cli/signup-cmd.js +0 -1
- package/build/lib-server/routes/sessions/close.js +2 -2
- package/build/lib-server/routes/sessions/mid-auth.js +2 -5
- package/build/main.js +12 -15
- package/build/mock/tls-options.js +46 -44
- package/build/signup/routes/add.js +4 -4
- package/build/tests/admin-proto/signup.d.ts +1 -0
- package/build/tests/admin-proto/signup.js +235 -0
- package/build/tests/jasmine.d.ts +1 -0
- package/build/tests/jasmine.js +32 -0
- package/build/tests/libs-for-tests/3nstorage.d.ts +22 -0
- package/build/tests/libs-for-tests/3nstorage.js +123 -0
- package/build/tests/libs-for-tests/asmail.d.ts +22 -0
- package/build/tests/libs-for-tests/asmail.js +179 -0
- package/build/tests/libs-for-tests/assert.d.ts +1 -0
- package/build/tests/libs-for-tests/assert.js +26 -0
- package/build/tests/libs-for-tests/async-jasmine.d.ts +7 -0
- package/build/tests/libs-for-tests/async-jasmine.js +77 -0
- package/build/tests/libs-for-tests/bytes-equal.d.ts +1 -0
- package/build/tests/libs-for-tests/bytes-equal.js +34 -0
- package/build/tests/libs-for-tests/json-copy.d.ts +1 -0
- package/build/tests/libs-for-tests/json-copy.js +45 -0
- package/build/tests/libs-for-tests/json-equal.d.ts +4 -0
- package/build/tests/libs-for-tests/json-equal.js +67 -0
- package/build/tests/libs-for-tests/mailerid.d.ts +13 -0
- package/build/tests/libs-for-tests/mailerid.js +114 -0
- package/build/tests/libs-for-tests/pkl.d.ts +28 -0
- package/build/tests/libs-for-tests/pkl.js +89 -0
- package/build/tests/libs-for-tests/server-components/3nstorage.d.ts +20 -0
- package/build/tests/libs-for-tests/server-components/3nstorage.js +200 -0
- package/build/tests/libs-for-tests/server-components/admin.d.ts +6 -0
- package/build/tests/libs-for-tests/server-components/admin.js +43 -0
- package/build/tests/libs-for-tests/server-components/asmail.d.ts +16 -0
- package/build/tests/libs-for-tests/server-components/asmail.js +143 -0
- package/build/tests/libs-for-tests/server-components/component.d.ts +13 -0
- package/build/tests/libs-for-tests/server-components/component.js +77 -0
- package/build/tests/libs-for-tests/server-components/mailerid.d.ts +10 -0
- package/build/tests/libs-for-tests/server-components/mailerid.js +103 -0
- package/build/tests/libs-for-tests/server-runner.d.ts +15 -0
- package/build/tests/libs-for-tests/server-runner.js +69 -0
- package/build/tests/libs-for-tests/spec-assembly.d.ts +6 -0
- package/build/tests/libs-for-tests/spec-assembly.js +55 -0
- package/build/tests/libs-for-tests/ws-utils.d.ts +3 -0
- package/build/tests/libs-for-tests/ws-utils.js +59 -0
- package/build/tests/libs-for-tests/xhr-utils.d.ts +61 -0
- package/build/tests/libs-for-tests/xhr-utils.js +154 -0
- package/build/tests/protocols/3nstorage/owner/specs/archive-obj-ver.d.ts +2 -0
- package/build/tests/protocols/3nstorage/owner/specs/archive-obj-ver.js +84 -0
- package/build/tests/protocols/3nstorage/owner/specs/archive-root-ver.d.ts +2 -0
- package/build/tests/protocols/3nstorage/owner/specs/archive-root-ver.js +78 -0
- package/build/tests/protocols/3nstorage/owner/specs/delete-archive-obj-ver.d.ts +2 -0
- package/build/tests/protocols/3nstorage/owner/specs/delete-archive-obj-ver.js +83 -0
- package/build/tests/protocols/3nstorage/owner/specs/delete-archive-root-ver.d.ts +2 -0
- package/build/tests/protocols/3nstorage/owner/specs/delete-archive-root-ver.js +77 -0
- package/build/tests/protocols/3nstorage/owner/specs/delete-obj.d.ts +2 -0
- package/build/tests/protocols/3nstorage/owner/specs/delete-obj.js +75 -0
- package/build/tests/protocols/3nstorage/owner/specs/events.d.ts +2 -0
- package/build/tests/protocols/3nstorage/owner/specs/events.js +91 -0
- package/build/tests/protocols/3nstorage/owner/specs/get-current-obj.d.ts +2 -0
- package/build/tests/protocols/3nstorage/owner/specs/get-current-obj.js +269 -0
- package/build/tests/protocols/3nstorage/owner/specs/get-current-root.d.ts +2 -0
- package/build/tests/protocols/3nstorage/owner/specs/get-current-root.js +262 -0
- package/build/tests/protocols/3nstorage/owner/specs/get-obj-status.d.ts +2 -0
- package/build/tests/protocols/3nstorage/owner/specs/get-obj-status.js +79 -0
- package/build/tests/protocols/3nstorage/owner/specs/get-root-status.d.ts +2 -0
- package/build/tests/protocols/3nstorage/owner/specs/get-root-status.js +72 -0
- package/build/tests/protocols/3nstorage/owner/specs/put-current-obj.d.ts +2 -0
- package/build/tests/protocols/3nstorage/owner/specs/put-current-obj.js +287 -0
- package/build/tests/protocols/3nstorage/owner/specs/put-current-root.d.ts +2 -0
- package/build/tests/protocols/3nstorage/owner/specs/put-current-root.js +274 -0
- package/build/tests/protocols/3nstorage/owner/specs/trans-cancel-root.d.ts +2 -0
- package/build/tests/protocols/3nstorage/owner/specs/trans-cancel-root.js +73 -0
- package/build/tests/protocols/3nstorage/owner/specs/trans-cancel.d.ts +2 -0
- package/build/tests/protocols/3nstorage/owner/specs/trans-cancel.js +72 -0
- package/build/tests/protocols/3nstorage/owner/test-utils.d.ts +14 -0
- package/build/tests/protocols/3nstorage/owner/test-utils.js +54 -0
- package/build/tests/protocols/3nstorage/owner.d.ts +1 -0
- package/build/tests/protocols/3nstorage/owner.js +138 -0
- package/build/tests/protocols/asmail/config.d.ts +1 -0
- package/build/tests/protocols/asmail/config.js +117 -0
- package/build/tests/protocols/asmail/delivery/specs/finalize-delivery.d.ts +2 -0
- package/build/tests/protocols/asmail/delivery/specs/finalize-delivery.js +60 -0
- package/build/tests/protocols/asmail/delivery/specs/provide-recipient-pubkey.d.ts +2 -0
- package/build/tests/protocols/asmail/delivery/specs/provide-recipient-pubkey.js +68 -0
- package/build/tests/protocols/asmail/delivery/specs/put-metadata.d.ts +2 -0
- package/build/tests/protocols/asmail/delivery/specs/put-metadata.js +83 -0
- package/build/tests/protocols/asmail/delivery/specs/put-obj.d.ts +2 -0
- package/build/tests/protocols/asmail/delivery/specs/put-obj.js +123 -0
- package/build/tests/protocols/asmail/delivery/specs/restart-session.d.ts +2 -0
- package/build/tests/protocols/asmail/delivery/specs/restart-session.js +79 -0
- package/build/tests/protocols/asmail/delivery/specs/start-session.d.ts +2 -0
- package/build/tests/protocols/asmail/delivery/specs/start-session.js +64 -0
- package/build/tests/protocols/asmail/delivery/test-utils.d.ts +16 -0
- package/build/tests/protocols/asmail/delivery/test-utils.js +46 -0
- package/build/tests/protocols/asmail/delivery.d.ts +1 -0
- package/build/tests/protocols/asmail/delivery.js +46 -0
- package/build/tests/protocols/asmail/retrieval/specs/events.d.ts +2 -0
- package/build/tests/protocols/asmail/retrieval/specs/events.js +62 -0
- package/build/tests/protocols/asmail/retrieval/specs/get-message-meta.d.ts +2 -0
- package/build/tests/protocols/asmail/retrieval/specs/get-message-meta.js +70 -0
- package/build/tests/protocols/asmail/retrieval/specs/get-message-obj.d.ts +2 -0
- package/build/tests/protocols/asmail/retrieval/specs/get-message-obj.js +166 -0
- package/build/tests/protocols/asmail/retrieval/specs/list-messages.d.ts +2 -0
- package/build/tests/protocols/asmail/retrieval/specs/list-messages.js +96 -0
- package/build/tests/protocols/asmail/retrieval/specs/remove-message.d.ts +2 -0
- package/build/tests/protocols/asmail/retrieval/specs/remove-message.js +66 -0
- package/build/tests/protocols/asmail/retrieval/test-utils.d.ts +17 -0
- package/build/tests/protocols/asmail/retrieval/test-utils.js +46 -0
- package/build/tests/protocols/asmail/retrieval.d.ts +1 -0
- package/build/tests/protocols/asmail/retrieval.js +92 -0
- package/build/tests/protocols/mailerid.d.ts +1 -0
- package/build/tests/protocols/mailerid.js +210 -0
- package/build/tests/shared-checks/check-mid-login.d.ts +2 -0
- package/build/tests/shared-checks/check-mid-login.js +131 -0
- package/build/tests/shared-checks/requests.d.ts +20 -0
- package/build/tests/shared-checks/requests.js +123 -0
- package/package.json +1 -1
- package/packing/create-deb.sh +57 -0
- package/packing/deb/lib/systemd/system/3nweb.service +11 -0
- package/packing/deb/postinst +44 -0
- package/packing/deb/usr/share/doc/3nweb-server/conf-for-postinstall.yaml +19 -0
- package/packing/deb/usr/share/doc/3nweb-server/copyright +22 -0
- package/publish-task.sh +10 -0
- package/push-to-github.sh +105 -0
- package/ts-code/3nstorage/3nstorage-app.ts +99 -0
- package/ts-code/3nstorage/owner.ts +178 -0
- package/ts-code/3nstorage/resources/sessions.ts +37 -0
- package/ts-code/3nstorage/resources/store.ts +896 -0
- package/ts-code/3nstorage/resources/users.ts +258 -0
- package/ts-code/3nstorage/routes/owner/archive-obj-version.ts +73 -0
- package/ts-code/3nstorage/routes/owner/cancel-trans.ts +58 -0
- package/ts-code/3nstorage/routes/owner/delete-obj.ts +103 -0
- package/ts-code/3nstorage/routes/owner/get-archived-obj-ver.ts +111 -0
- package/ts-code/3nstorage/routes/owner/get-current-obj.ts +122 -0
- package/ts-code/3nstorage/routes/owner/get-obj-status.ts +55 -0
- package/ts-code/3nstorage/routes/owner/param-getter.ts +51 -0
- package/ts-code/3nstorage/routes/owner/param-setter.ts +50 -0
- package/ts-code/3nstorage/routes/owner/put-current-obj.ts +284 -0
- package/ts-code/3nstorage/routes/owner/session-params.ts +49 -0
- package/ts-code/3nstorage/shared.ts +43 -0
- package/ts-code/asmail/asmail-app.ts +91 -0
- package/ts-code/asmail/config.ts +96 -0
- package/ts-code/asmail/delivery.ts +94 -0
- package/ts-code/asmail/resources/delivery-sessions.ts +118 -0
- package/ts-code/asmail/resources/inbox.ts +696 -0
- package/ts-code/asmail/resources/recipients.ts +495 -0
- package/ts-code/asmail/resources/sessions.ts +37 -0
- package/ts-code/asmail/retrieval.ts +96 -0
- package/ts-code/asmail/routes/config/param-getter.ts +49 -0
- package/ts-code/asmail/routes/config/param-setter.ts +49 -0
- package/ts-code/asmail/routes/delivery/finalize-delivery.ts +50 -0
- package/ts-code/asmail/routes/delivery/pre-flight.ts +132 -0
- package/ts-code/asmail/routes/delivery/provide-recipient-pubkey.ts +58 -0
- package/ts-code/asmail/routes/delivery/put-metadata.ts +94 -0
- package/ts-code/asmail/routes/delivery/put-obj.ts +166 -0
- package/ts-code/asmail/routes/delivery/restart-session.ts +130 -0
- package/ts-code/asmail/routes/delivery/sender-authorization.ts +81 -0
- package/ts-code/asmail/routes/delivery/start-session.ts +151 -0
- package/ts-code/asmail/routes/retrieval/get-message-meta.ts +53 -0
- package/ts-code/asmail/routes/retrieval/get-message-obj.ts +109 -0
- package/ts-code/asmail/routes/retrieval/list-messages.ts +70 -0
- package/ts-code/asmail/routes/retrieval/remove-message.ts +47 -0
- package/ts-code/cli/index.ts +82 -0
- package/ts-code/cli/run-cmd.ts +81 -0
- package/ts-code/cli/show-sample-config.ts +78 -0
- package/ts-code/cli/signup-cmd.ts +229 -0
- package/ts-code/cli/user-cmd.ts +68 -0
- package/ts-code/cli/utils.ts +105 -0
- package/ts-code/config/default-confs.ts +22 -0
- package/ts-code/config/from-yaml.ts +35 -0
- package/ts-code/config/letsencrypt.ts +77 -0
- package/ts-code/config/signup.ts +137 -0
- package/ts-code/lib-common/admin-api/signup.ts +120 -0
- package/ts-code/lib-common/assert.ts +22 -0
- package/ts-code/lib-common/async-fs-node.ts +656 -0
- package/ts-code/lib-common/buffer-utils.ts +124 -0
- package/ts-code/lib-common/byte-streaming/common.ts +166 -0
- package/ts-code/lib-common/bytes-equal.ts +25 -0
- package/ts-code/lib-common/canonical-address.ts +92 -0
- package/ts-code/lib-common/exceptions/error.ts +44 -0
- package/ts-code/lib-common/exceptions/file.ts +84 -0
- package/ts-code/lib-common/exceptions/http.ts +69 -0
- package/ts-code/lib-common/ipc/generic-ipc.ts +750 -0
- package/ts-code/lib-common/ipc/ws-ipc.ts +117 -0
- package/ts-code/lib-common/json-equal.ts +55 -0
- package/ts-code/lib-common/json-utils.ts +130 -0
- package/ts-code/lib-common/jwkeys.ts +246 -0
- package/ts-code/lib-common/map-of-sets.ts +60 -0
- package/ts-code/lib-common/mid-sigs-NaCl-Ed.ts +677 -0
- package/ts-code/lib-common/objs-on-disk/file-layout.ts +480 -0
- package/ts-code/lib-common/objs-on-disk/obj-file.ts +325 -0
- package/ts-code/lib-common/objs-on-disk/utils.ts +201 -0
- package/ts-code/lib-common/objs-on-disk/v1-obj-file-format.ts +329 -0
- package/ts-code/lib-common/processes.ts +501 -0
- package/ts-code/lib-common/random-node.ts +79 -0
- package/ts-code/lib-common/service-api/3nstorage/owner.ts +559 -0
- package/ts-code/lib-common/service-api/3nstorage/root-route.ts +22 -0
- package/ts-code/lib-common/service-api/asmail/config.ts +144 -0
- package/ts-code/lib-common/service-api/asmail/delivery.ts +250 -0
- package/ts-code/lib-common/service-api/asmail/retrieval.ts +238 -0
- package/ts-code/lib-common/service-api/asmail/root-route.ts +22 -0
- package/ts-code/lib-common/service-api/ipc-api.ts +44 -0
- package/ts-code/lib-common/service-api/locker.ts +44 -0
- package/ts-code/lib-common/service-api/mailer-id/login.ts +80 -0
- package/ts-code/lib-common/service-api/mailer-id/provisioning.ts +64 -0
- package/ts-code/lib-common/service-api/mailer-id/root-route.ts +25 -0
- package/ts-code/lib-common/service-api/pub-key-login.ts +75 -0
- package/ts-code/lib-common/service-api/web-socket-base.ts +87 -0
- package/ts-code/lib-common/session-encryptor.ts +54 -0
- package/ts-code/lib-common/time-window-cache.ts +74 -0
- package/ts-code/lib-common/transferable.d.ts +30 -0
- package/ts-code/lib-server/conf-util.ts +35 -0
- package/ts-code/lib-server/mid-access.ts +45 -0
- package/ts-code/lib-server/middleware/body-parsers.ts +248 -0
- package/ts-code/lib-server/middleware/error-handler.ts +79 -0
- package/ts-code/lib-server/pkl-access.ts +46 -0
- package/ts-code/lib-server/resources/dns.ts +151 -0
- package/ts-code/lib-server/resources/mailerid-authorizer.ts +115 -0
- package/ts-code/lib-server/resources/mem-backed-sessions-factory.ts +132 -0
- package/ts-code/lib-server/resources/server-data-folders.ts +160 -0
- package/ts-code/lib-server/resources/server-key-for-pkl-challenge.ts +41 -0
- package/ts-code/lib-server/resources/sessions.ts +232 -0
- package/ts-code/lib-server/resources/user-files.ts +147 -0
- package/ts-code/lib-server/routes/pub-key-login/complete-exchange.ts +63 -0
- package/ts-code/lib-server/routes/pub-key-login/start-exchange.ts +189 -0
- package/ts-code/lib-server/routes/sessions/close.ts +27 -0
- package/ts-code/lib-server/routes/sessions/mid-auth.ts +77 -0
- package/ts-code/lib-server/routes/sessions/start.ts +116 -0
- package/ts-code/lib-server/web-sockets/app.ts +339 -0
- package/ts-code/lib-server/web-sockets/server-events.ts +63 -0
- package/ts-code/lib.ts +29 -0
- package/ts-code/locker/locker-app.ts +60 -0
- package/ts-code/locker/resources/lockers.ts +17 -0
- package/ts-code/locker/resources/sessions.ts +37 -0
- package/ts-code/locker/routes/create-locker.ts +47 -0
- package/ts-code/mailerId/mailerId-app.ts +107 -0
- package/ts-code/mailerId/resources/certifier.ts +181 -0
- package/ts-code/mailerId/resources/sessions.ts +44 -0
- package/ts-code/mailerId/resources/users.ts +88 -0
- package/ts-code/mailerId/routes/certify.ts +68 -0
- package/ts-code/main.ts +304 -0
- package/ts-code/mock/dns.ts +106 -0
- package/ts-code/mock/mock-as-child-proc.ts +130 -0
- package/ts-code/mock/node-child-ipc.ts +69 -0
- package/ts-code/mock/run-in-proc.ts +111 -0
- package/ts-code/mock/tls-options.ts +73 -0
- package/ts-code/services.ts +138 -0
- package/ts-code/signup/resources/users.ts +429 -0
- package/ts-code/signup/routes/add.ts +65 -0
- package/ts-code/signup/routes/get-available-addresses.ts +49 -0
- package/ts-code/signup/routes/get-available-domains.ts +45 -0
- package/ts-code/signup/signup-app.ts +54 -0
- package/ts-code/signup/signup-tokens.ts +148 -0
- package/ts-code/tests/admin-proto/signup.ts +277 -0
- package/ts-code/tests/jasmine.ts +37 -0
- package/ts-code/tests/libs-for-tests/3nstorage.ts +144 -0
- package/ts-code/tests/libs-for-tests/asmail.ts +220 -0
- package/ts-code/tests/libs-for-tests/assert.ts +22 -0
- package/ts-code/tests/libs-for-tests/async-jasmine.ts +89 -0
- package/ts-code/tests/libs-for-tests/bytes-equal.ts +25 -0
- package/ts-code/tests/libs-for-tests/json-copy.ts +38 -0
- package/ts-code/tests/libs-for-tests/json-equal.ts +55 -0
- package/ts-code/tests/libs-for-tests/mailerid.ts +123 -0
- package/ts-code/tests/libs-for-tests/pkl.ts +127 -0
- package/ts-code/tests/libs-for-tests/server-components/3nstorage.ts +206 -0
- package/ts-code/tests/libs-for-tests/server-components/admin.ts +49 -0
- package/ts-code/tests/libs-for-tests/server-components/asmail.ts +152 -0
- package/ts-code/tests/libs-for-tests/server-components/component.ts +90 -0
- package/ts-code/tests/libs-for-tests/server-components/mailerid.ts +114 -0
- package/ts-code/tests/libs-for-tests/server-runner.ts +82 -0
- package/ts-code/tests/libs-for-tests/spec-assembly.ts +60 -0
- package/ts-code/tests/libs-for-tests/ws-utils.ts +61 -0
- package/ts-code/tests/libs-for-tests/xhr-utils.ts +179 -0
- package/ts-code/tests/protocols/3nstorage/owner/specs/archive-obj-ver.ts +100 -0
- package/ts-code/tests/protocols/3nstorage/owner/specs/archive-root-ver.ts +91 -0
- package/ts-code/tests/protocols/3nstorage/owner/specs/delete-archive-obj-ver.ts +99 -0
- package/ts-code/tests/protocols/3nstorage/owner/specs/delete-archive-root-ver.ts +90 -0
- package/ts-code/tests/protocols/3nstorage/owner/specs/delete-obj.ts +84 -0
- package/ts-code/tests/protocols/3nstorage/owner/specs/events.ts +125 -0
- package/ts-code/tests/protocols/3nstorage/owner/specs/get-current-obj.ts +298 -0
- package/ts-code/tests/protocols/3nstorage/owner/specs/get-current-root.ts +290 -0
- package/ts-code/tests/protocols/3nstorage/owner/specs/get-obj-status.ts +88 -0
- package/ts-code/tests/protocols/3nstorage/owner/specs/get-root-status.ts +80 -0
- package/ts-code/tests/protocols/3nstorage/owner/specs/put-current-obj.ts +366 -0
- package/ts-code/tests/protocols/3nstorage/owner/specs/put-current-root.ts +329 -0
- package/ts-code/tests/protocols/3nstorage/owner/specs/trans-cancel-root.ts +86 -0
- package/ts-code/tests/protocols/3nstorage/owner/specs/trans-cancel.ts +86 -0
- package/ts-code/tests/protocols/3nstorage/owner/test-utils.ts +72 -0
- package/ts-code/tests/protocols/3nstorage/owner.ts +198 -0
- package/ts-code/tests/protocols/asmail/config.ts +172 -0
- package/ts-code/tests/protocols/asmail/delivery/specs/finalize-delivery.ts +69 -0
- package/ts-code/tests/protocols/asmail/delivery/specs/provide-recipient-pubkey.ts +88 -0
- package/ts-code/tests/protocols/asmail/delivery/specs/put-metadata.ts +102 -0
- package/ts-code/tests/protocols/asmail/delivery/specs/put-obj.ts +156 -0
- package/ts-code/tests/protocols/asmail/delivery/specs/restart-session.ts +97 -0
- package/ts-code/tests/protocols/asmail/delivery/specs/start-session.ts +79 -0
- package/ts-code/tests/protocols/asmail/delivery/test-utils.ts +64 -0
- package/ts-code/tests/protocols/asmail/delivery.ts +56 -0
- package/ts-code/tests/protocols/asmail/retrieval/specs/events.ts +78 -0
- package/ts-code/tests/protocols/asmail/retrieval/specs/get-message-meta.ts +80 -0
- package/ts-code/tests/protocols/asmail/retrieval/specs/get-message-obj.ts +197 -0
- package/ts-code/tests/protocols/asmail/retrieval/specs/list-messages.ts +110 -0
- package/ts-code/tests/protocols/asmail/retrieval/specs/remove-message.ts +74 -0
- package/ts-code/tests/protocols/asmail/retrieval/test-utils.ts +60 -0
- package/ts-code/tests/protocols/asmail/retrieval.ts +115 -0
- package/ts-code/tests/protocols/mailerid.ts +271 -0
- package/ts-code/tests/shared-checks/check-mid-login.ts +164 -0
- package/ts-code/tests/shared-checks/requests.ts +135 -0
- package/ts-code/tsconfig.json +11 -0
- 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);
|