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.
- 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/resources/store.d.ts +2 -2
- package/build/3nstorage/resources/store.js +1 -1
- package/build/3nstorage/resources/users.d.ts +3 -3
- package/build/3nstorage/resources/users.js +1 -1
- package/build/3nstorage/resources/utils.d.ts +6 -0
- package/build/3nstorage/resources/utils.js +41 -0
- package/build/3nstorage/routes/owner/archive-obj-version.js +8 -10
- package/build/3nstorage/routes/owner/cancel-trans.js +5 -4
- package/build/3nstorage/routes/owner/delete-obj.js +7 -8
- package/build/3nstorage/routes/owner/get-archived-obj-ver.js +11 -13
- package/build/3nstorage/routes/owner/get-current-obj.js +7 -6
- package/build/3nstorage/routes/owner/get-obj-status.js +8 -8
- package/build/3nstorage/routes/owner/put-current-obj.js +25 -55
- package/build/3nstorage/routes/owner/session-params.js +2 -0
- package/build/asmail/resources/utils.d.ts +6 -0
- package/build/asmail/resources/utils.js +36 -0
- package/build/asmail/routes/delivery/finalize-delivery.js +3 -2
- package/build/asmail/routes/delivery/pre-flight.js +9 -26
- package/build/asmail/routes/delivery/provide-recipient-pubkey.js +4 -3
- package/build/asmail/routes/delivery/put-metadata.js +13 -21
- package/build/asmail/routes/delivery/put-obj.js +19 -25
- package/build/asmail/routes/delivery/restart-session.d.ts +4 -8
- package/build/asmail/routes/delivery/restart-session.js +10 -23
- package/build/asmail/routes/delivery/sender-authorization.js +5 -5
- package/build/asmail/routes/delivery/start-session.js +9 -24
- package/build/asmail/routes/retrieval/get-message-meta.js +4 -7
- package/build/asmail/routes/retrieval/get-message-obj.js +10 -7
- package/build/asmail/routes/retrieval/list-messages.js +4 -4
- package/build/asmail/routes/retrieval/remove-message.js +3 -2
- package/build/mock/tls-options.js +46 -44
- 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/resources/utils.ts +45 -0
- package/ts-code/3nstorage/routes/owner/archive-obj-version.ts +71 -0
- package/ts-code/3nstorage/routes/owner/cancel-trans.ts +60 -0
- package/ts-code/3nstorage/routes/owner/delete-obj.ts +99 -0
- package/ts-code/3nstorage/routes/owner/get-archived-obj-ver.ts +109 -0
- package/ts-code/3nstorage/routes/owner/get-current-obj.ts +124 -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 +257 -0
- package/ts-code/3nstorage/routes/owner/session-params.ts +50 -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/resources/utils.ts +41 -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 +51 -0
- package/ts-code/asmail/routes/delivery/pre-flight.ts +118 -0
- package/ts-code/asmail/routes/delivery/provide-recipient-pubkey.ts +58 -0
- package/ts-code/asmail/routes/delivery/put-metadata.ts +85 -0
- package/ts-code/asmail/routes/delivery/put-obj.ts +152 -0
- package/ts-code/asmail/routes/delivery/restart-session.ts +117 -0
- package/ts-code/asmail/routes/delivery/sender-authorization.ts +81 -0
- package/ts-code/asmail/routes/delivery/start-session.ts +136 -0
- package/ts-code/asmail/routes/retrieval/get-message-meta.ts +50 -0
- package/ts-code/asmail/routes/retrieval/get-message-obj.ts +106 -0
- package/ts-code/asmail/routes/retrieval/list-messages.ts +68 -0
- package/ts-code/asmail/routes/retrieval/remove-message.ts +48 -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,124 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright (C) 2017, 2020, 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 { GetCurrentObj, SC as storeSC } from '../../resources/users';
|
|
20
|
+
import { GetObjQueryOpts, ERR_SC, HTTP_HEADER, BIN_TYPE, currentObj as api } from '../../../lib-common/service-api/3nstorage/owner';
|
|
21
|
+
import { Request } from '../../resources/sessions';
|
|
22
|
+
import { errWithCause, stringifyErr } from '../../../lib-common/exceptions/error';
|
|
23
|
+
import { EMPTY_BUFFER } from '../../../lib-common/buffer-utils';
|
|
24
|
+
import { getObjIdFromParams, replyWithErr } from '../../resources/utils';
|
|
25
|
+
|
|
26
|
+
function extractQueryOptions(req: Request): undefined|{
|
|
27
|
+
header: boolean; limit: number|undefined; ofs: number;
|
|
28
|
+
ver: number|undefined;
|
|
29
|
+
} {
|
|
30
|
+
// query fields are string or undefined, yet, type info helps the show
|
|
31
|
+
const query: GetObjQueryOpts = req.query;
|
|
32
|
+
|
|
33
|
+
const header = ((query.header as any) === 'true');
|
|
34
|
+
|
|
35
|
+
const ofs = (query.ofs ? parseInt(query.ofs as any) : 0);
|
|
36
|
+
if (isNaN(ofs) ||
|
|
37
|
+
(ofs < 0) ||
|
|
38
|
+
(header && (ofs > 0))) { return; }
|
|
39
|
+
|
|
40
|
+
const limit = (query.limit ? parseInt(query.limit as any) : undefined);
|
|
41
|
+
if (limit !== undefined) {
|
|
42
|
+
if (isNaN(limit) ||
|
|
43
|
+
(limit < 0) ||
|
|
44
|
+
(!header && (limit === 0))) { return; }
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
let ver = (query.ver ? parseInt(query.ver as any) : undefined);
|
|
48
|
+
if (ver !== undefined) {
|
|
49
|
+
if (isNaN(ver!)) {
|
|
50
|
+
ver = undefined;
|
|
51
|
+
} else if (ver < 1) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return { header, limit, ofs, ver };
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function getCurrentObj(
|
|
60
|
+
root: boolean, getCurrentObjFunc: GetCurrentObj
|
|
61
|
+
): RequestHandler {
|
|
62
|
+
|
|
63
|
+
return async (req: Request, res, next) => {
|
|
64
|
+
|
|
65
|
+
const userId = req.session.params.userId;
|
|
66
|
+
const { objId, objIdParseErr } = getObjIdFromParams(root, req);
|
|
67
|
+
if (objIdParseErr) {
|
|
68
|
+
return replyWithErr(ERR_SC.malformed, objIdParseErr, res);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const opts = extractQueryOptions(req);
|
|
72
|
+
if (!opts) {
|
|
73
|
+
res.status(ERR_SC.malformed).send("Bad query parameters");
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
try {
|
|
78
|
+
const { version, reader } = await getCurrentObjFunc(userId, objId,
|
|
79
|
+
opts.header, opts.ofs, opts.limit);
|
|
80
|
+
if (opts.ver) {
|
|
81
|
+
if (opts.ver !== version) {
|
|
82
|
+
res.set(HTTP_HEADER.objVersion, `${version}`);
|
|
83
|
+
res.status(api.SC.unknownObjVer).send();
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
} else {
|
|
87
|
+
res.set(HTTP_HEADER.objVersion, `${version}`);
|
|
88
|
+
}
|
|
89
|
+
res.status(api.SC.okGet);
|
|
90
|
+
res.set(HTTP_HEADER.contentType, BIN_TYPE);
|
|
91
|
+
res.set(HTTP_HEADER.contentLength, `${reader.len}`);
|
|
92
|
+
if (opts.header) {
|
|
93
|
+
res.set(HTTP_HEADER.objHeaderLength, `${reader.headerLen}`);
|
|
94
|
+
}
|
|
95
|
+
res.set(HTTP_HEADER.objSegmentsLength, `${reader.segsLen}`);
|
|
96
|
+
if (reader.len > 0) {
|
|
97
|
+
try {
|
|
98
|
+
await reader.pipe!(res);
|
|
99
|
+
} catch (err) {
|
|
100
|
+
console.error(stringifyErr(errWithCause(err, `Wasn't able to complete sending segments due to error in piping`)));
|
|
101
|
+
} finally {
|
|
102
|
+
res.end();
|
|
103
|
+
}
|
|
104
|
+
} else {
|
|
105
|
+
res.send(EMPTY_BUFFER);
|
|
106
|
+
}
|
|
107
|
+
} catch (err) {
|
|
108
|
+
if ("string" !== typeof err) {
|
|
109
|
+
next(err);
|
|
110
|
+
} else if ((err === storeSC.OBJ_UNKNOWN)
|
|
111
|
+
|| (err === storeSC.OBJ_VER_UNKNOWN)) {
|
|
112
|
+
replyWithErr(api.SC.unknownObj, (objId ? `Object ${objId} is unknown.` : `Root object is not set.`), res);
|
|
113
|
+
} else if (err === storeSC.USER_UNKNOWN) {
|
|
114
|
+
replyWithErr(ERR_SC.server, `Recipient disappeared from the system.`, res);
|
|
115
|
+
req.session.close();
|
|
116
|
+
} else {
|
|
117
|
+
next(new Error(`Unhandled storage error code: ${err}`));
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
};
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
Object.freeze(exports);
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright (C) 2022, 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 { GetObjStatus, SC as storeSC } from '../../resources/users';
|
|
20
|
+
import { objStatus as api, ERR_SC } from '../../../lib-common/service-api/3nstorage/owner';
|
|
21
|
+
import { Request } from '../../resources/sessions';
|
|
22
|
+
import { getObjIdFromParams, replyWithErr } from '../../resources/utils';
|
|
23
|
+
|
|
24
|
+
export function getObjStatus(
|
|
25
|
+
root: boolean, getObjStatusFunc: GetObjStatus
|
|
26
|
+
): RequestHandler {
|
|
27
|
+
|
|
28
|
+
return async (req: Request, res, next) => {
|
|
29
|
+
|
|
30
|
+
const userId = req.session.params.userId;
|
|
31
|
+
const { objId, objIdParseErr } = getObjIdFromParams(root, req);
|
|
32
|
+
if (objIdParseErr) {
|
|
33
|
+
return replyWithErr(ERR_SC.malformed, objIdParseErr, res);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
try {
|
|
37
|
+
const lst = await getObjStatusFunc(userId, objId);
|
|
38
|
+
res.status(api.SC.ok).json(lst);
|
|
39
|
+
} catch (err) {
|
|
40
|
+
if ("string" !== typeof err) {
|
|
41
|
+
next(err);
|
|
42
|
+
} else if (err === storeSC.OBJ_UNKNOWN) {
|
|
43
|
+
replyWithErr(api.SC.unknownObj, (root ? `Root object is set.` : `Object ${objId} is unknown.`), res);
|
|
44
|
+
} else if (err === storeSC.USER_UNKNOWN) {
|
|
45
|
+
replyWithErr(ERR_SC.server, "Recipient disappeared from the system.", res);
|
|
46
|
+
req.session.close();
|
|
47
|
+
} else {
|
|
48
|
+
next(new Error("Unhandled storage error code: "+err));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
Object.freeze(exports);
|
|
@@ -0,0 +1,51 @@
|
|
|
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 } from 'express';
|
|
19
|
+
import { SC as storeSC } from '../../resources/users';
|
|
20
|
+
import { PARAM_SC, ERR_SC } from '../../../lib-common/service-api/3nstorage/owner';
|
|
21
|
+
import { Request } from '../../resources/sessions';
|
|
22
|
+
|
|
23
|
+
export function getParam<T>(
|
|
24
|
+
paramGetter: (userId: string) => Promise<T>
|
|
25
|
+
): RequestHandler {
|
|
26
|
+
|
|
27
|
+
if ('function' !== typeof paramGetter) { throw new TypeError(
|
|
28
|
+
"Given argument 'paramGetter' must be function, but is not."); }
|
|
29
|
+
|
|
30
|
+
return async (req: Request, res, next) => {
|
|
31
|
+
|
|
32
|
+
const session = req.session;
|
|
33
|
+
const userId = session.params.userId;
|
|
34
|
+
|
|
35
|
+
try{
|
|
36
|
+
const value = await paramGetter(userId);
|
|
37
|
+
res.status(PARAM_SC.ok).json(value);
|
|
38
|
+
} catch (err) {
|
|
39
|
+
if (err === storeSC.USER_UNKNOWN) {
|
|
40
|
+
res.status(ERR_SC.server).send(
|
|
41
|
+
"Recipient disappeared from the system.");
|
|
42
|
+
session.close();
|
|
43
|
+
} else {
|
|
44
|
+
next(err);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
}
|
|
51
|
+
Object.freeze(exports);
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright (C) 2015 - 2016, 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 storeSC } from '../../resources/users';
|
|
20
|
+
import { PARAM_SC, ERR_SC } from '../../../lib-common/service-api/3nstorage/owner';
|
|
21
|
+
import { Request } from '../../resources/sessions';
|
|
22
|
+
|
|
23
|
+
export function setParam<T>(
|
|
24
|
+
paramSetter: (userId: string, param: T) => Promise<boolean>
|
|
25
|
+
): RequestHandler {
|
|
26
|
+
|
|
27
|
+
return async (req: Request, res, next) => {
|
|
28
|
+
|
|
29
|
+
const session = req.session;
|
|
30
|
+
const userId = session.params.userId;
|
|
31
|
+
const pValue: T = req.body;
|
|
32
|
+
|
|
33
|
+
try{
|
|
34
|
+
const valChanged = await paramSetter(userId, pValue)
|
|
35
|
+
if (valChanged) {
|
|
36
|
+
res.status(PARAM_SC.ok).send();
|
|
37
|
+
} else {
|
|
38
|
+
res.status(ERR_SC.malformed).send('Malformed parameter value.');
|
|
39
|
+
}
|
|
40
|
+
} catch (err) {
|
|
41
|
+
if (err === storeSC.USER_UNKNOWN) {
|
|
42
|
+
res.status(ERR_SC.server).send("Recipient disappeared from the system.");
|
|
43
|
+
session.close();
|
|
44
|
+
} else {
|
|
45
|
+
next(err);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright (C) 2017, 2019 - 2020, 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 { SaveNewObjVersion, SC as saveSC, MismatchedObjVerException } from '../../resources/users';
|
|
20
|
+
import { currentObj as api, ERR_SC, HTTP_HEADER, BIN_TYPE, PutObjFirstQueryOpts, PutObjSecondQueryOpts, DiffInfo, sanitizedDiff, ErrorReply } from '../../../lib-common/service-api/3nstorage/owner';
|
|
21
|
+
import { stringToNumOfBytes } from '../../../lib-server/conf-util';
|
|
22
|
+
import { Request } from '../../resources/sessions';
|
|
23
|
+
import { attachByteDrainToRequest } from '../../../lib-server/middleware/body-parsers';
|
|
24
|
+
import { Readable as ReadableStream } from 'stream';
|
|
25
|
+
import { BytesFIFOBuffer } from '../../../lib-common/byte-streaming/common';
|
|
26
|
+
import { defer, Deferred } from '../../../lib-common/processes';
|
|
27
|
+
import { utf8 } from '../../../lib-common/buffer-utils';
|
|
28
|
+
import { getObjIdFromParams, replyWithErr } from '../../resources/utils';
|
|
29
|
+
|
|
30
|
+
export function saveCurrentObj(
|
|
31
|
+
root: boolean, saveObjFunc: SaveNewObjVersion, chunkLimit: string|number
|
|
32
|
+
): RequestHandler {
|
|
33
|
+
if ('function' !== typeof saveObjFunc) { throw new TypeError(
|
|
34
|
+
"Given argument 'saveObjFunc' must be function, but is not."); }
|
|
35
|
+
const maxChunkSize = stringToNumOfBytes(chunkLimit);
|
|
36
|
+
|
|
37
|
+
return async (req: Request, res, next) => {
|
|
38
|
+
|
|
39
|
+
if (!req.is(BIN_TYPE)) {
|
|
40
|
+
return replyWithErr(ERR_SC.wrongContentType, `Content-Type must be ${BIN_TYPE} for this call.`, res, req);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// get and check Content-Length, implicitly sending replies for bad length
|
|
44
|
+
let len = getContentLenOrSendError(req, res, maxChunkSize);
|
|
45
|
+
if (len === undefined) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const userId = req.session.params.userId;
|
|
50
|
+
const { objId, objIdParseErr } = getObjIdFromParams(root, req);
|
|
51
|
+
if (objIdParseErr) {
|
|
52
|
+
return replyWithErr(ERR_SC.malformed, objIdParseErr, res, req);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// extract and check query parameters
|
|
56
|
+
const opts = extractQueryOptions(req);
|
|
57
|
+
if (!opts) {
|
|
58
|
+
return replyWithErr(ERR_SC.malformed, "Bad query parameters", res, req);
|
|
59
|
+
}
|
|
60
|
+
const { fstReq, sndReq } = opts;
|
|
61
|
+
|
|
62
|
+
let diff: DiffInfo|undefined;
|
|
63
|
+
|
|
64
|
+
if (fstReq) {
|
|
65
|
+
|
|
66
|
+
// cross-check given lengths
|
|
67
|
+
const diffAndHeader = fstReq.header + (fstReq.diff ? fstReq.diff : 0);
|
|
68
|
+
if (diffAndHeader > len) {
|
|
69
|
+
return replyWithErr(ERR_SC.malformed, "Bad query parameters", res, req);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// read diff, if it is expected
|
|
73
|
+
if (fstReq.diff) {
|
|
74
|
+
let diffBytes = await readChunkFrom(req, fstReq.diff).catch(noop);
|
|
75
|
+
if (diffBytes) {
|
|
76
|
+
len -= fstReq.diff;
|
|
77
|
+
} else {
|
|
78
|
+
return replyWithErr(ERR_SC.malformed, "Cannot read diff bytes", res, req);
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
const diffFromReq = JSON.parse(utf8.open(diffBytes));
|
|
82
|
+
diff = sanitizedDiff(diffFromReq, fstReq.ver);
|
|
83
|
+
if (!diff) {
|
|
84
|
+
return replyWithErr(ERR_SC.malformed, "Malformed diff info", res, req);
|
|
85
|
+
}
|
|
86
|
+
} catch (err) {
|
|
87
|
+
return replyWithErr(ERR_SC.malformed, "Malformed diff info", res, req);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
} else if (sndReq) {
|
|
92
|
+
|
|
93
|
+
if ((len === 0) && !sndReq.last) {
|
|
94
|
+
return replyWithErr(ERR_SC.malformed, "No segment bytes", res, req);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
try {
|
|
100
|
+
const transactionId = await saveObjFunc(userId, objId, fstReq, diff, sndReq, len, req);
|
|
101
|
+
const reply: api.ReplyToPut = (transactionId ? { transactionId } : {});
|
|
102
|
+
res.status(api.SC.okPut).json(reply);
|
|
103
|
+
} catch (err) {
|
|
104
|
+
if ("string" !== typeof err) {
|
|
105
|
+
if ((err as MismatchedObjVerException).type === 'mismatched-obj-ver') {
|
|
106
|
+
const rep: api.MismatchedObjVerReply = {
|
|
107
|
+
error: "Current object version doesn't match assumed one.",
|
|
108
|
+
current_version: (err as MismatchedObjVerException).current_version
|
|
109
|
+
};
|
|
110
|
+
res.set(HTTP_HEADER.objVersion, `${rep.current_version}`);
|
|
111
|
+
res.status(api.SC.mismatchedObjVer).json(rep);
|
|
112
|
+
} else {
|
|
113
|
+
next(err);
|
|
114
|
+
}
|
|
115
|
+
} else if ((err === saveSC.OBJ_UNKNOWN)
|
|
116
|
+
|| (err === saveSC.OBJ_VER_UNKNOWN)) {
|
|
117
|
+
replyWithErr(api.SC.unknownObj, `Unknown object ${objId}.`, res);
|
|
118
|
+
} else if (err === saveSC.TRANSACTION_UNKNOWN) {
|
|
119
|
+
replyWithErr(api.SC.unknownTransaction, "Unknown transaction.", res);
|
|
120
|
+
} else if ((err === saveSC.OBJ_EXIST)
|
|
121
|
+
|| (err === saveSC.OBJ_VER_EXIST)) {
|
|
122
|
+
replyWithErr(api.SC.objAlreadyExists, "Object already exists.", res);
|
|
123
|
+
} else if (err === saveSC.CONCURRENT_TRANSACTION) {
|
|
124
|
+
replyWithErr(api.SC.concurrentTransaction, `Object ${objId} is currently under a transaction.`, res);
|
|
125
|
+
} else if (err === saveSC.USER_UNKNOWN) {
|
|
126
|
+
replyWithErr(ERR_SC.server, "Recipient disappeared from the system.", res);
|
|
127
|
+
req.session.close();
|
|
128
|
+
} else if (err === saveSC.NOT_ENOUGH_SPACE) {
|
|
129
|
+
replyWithErr(ERR_SC.noSpace, "Reached storage limits.", res);
|
|
130
|
+
} else if (err === saveSC.OBJ_FILE_INCOMPLETE) {
|
|
131
|
+
replyWithErr(api.SC.objIncomplete, "Object version file is incomplete.", res);
|
|
132
|
+
} else {
|
|
133
|
+
next(new Error(`Unhandled storage error code: ${err}`));
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function extractQueryOptions(req: Request): undefined|{
|
|
140
|
+
fstReq?: PutObjFirstQueryOpts; sndReq?: PutObjSecondQueryOpts;
|
|
141
|
+
} {
|
|
142
|
+
if ((req.query as any as PutObjSecondQueryOpts).trans) {
|
|
143
|
+
// this is the second (not first) request
|
|
144
|
+
// query fields are string or undefined, yet, type info helps the show
|
|
145
|
+
const query = req.query as any as PutObjSecondQueryOpts;
|
|
146
|
+
|
|
147
|
+
const trans = query.trans;
|
|
148
|
+
|
|
149
|
+
const last = ((query.last as any) === 'true');
|
|
150
|
+
|
|
151
|
+
const ofs = parseInt(query.ofs as any);
|
|
152
|
+
if (isNaN(ofs)) { return; }
|
|
153
|
+
|
|
154
|
+
return { sndReq: { last, ofs, trans } };
|
|
155
|
+
|
|
156
|
+
} else {
|
|
157
|
+
// this is the first request
|
|
158
|
+
// query fields are string or undefined, yet, type info helps the show
|
|
159
|
+
const query = req.query as any as PutObjFirstQueryOpts;
|
|
160
|
+
|
|
161
|
+
const ver = parseInt(query.ver as any);
|
|
162
|
+
if (isNaN(ver) || (ver < 1)) { return; }
|
|
163
|
+
|
|
164
|
+
const diff = (query.diff ? parseInt(query.diff as any) : undefined);
|
|
165
|
+
if (diff !== undefined) {
|
|
166
|
+
if (isNaN(diff) || (diff < 2) || (diff > 1024)) { return; }
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const header = parseInt(query.header as any);
|
|
170
|
+
if (isNaN(header) || (header < 1)) { return; }
|
|
171
|
+
|
|
172
|
+
const last = ((query.last as any) === 'true');
|
|
173
|
+
|
|
174
|
+
return { fstReq: { diff, header, last, ver } };
|
|
175
|
+
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function getContentLenOrSendError(
|
|
180
|
+
req: Request, res: Response, maxChunkSize: number
|
|
181
|
+
): number|undefined {
|
|
182
|
+
const contentLength = parseInt(req.get(HTTP_HEADER.contentLength)!);
|
|
183
|
+
if (isNaN(contentLength)) {
|
|
184
|
+
replyWithErr(ERR_SC.contentLenMissing, "Content-Length header is required with proper number.", res, req);
|
|
185
|
+
} else if (contentLength > maxChunkSize) {
|
|
186
|
+
replyWithErr(ERR_SC.contentTooLong, "Request body is too long.", res, req);
|
|
187
|
+
} else {
|
|
188
|
+
return contentLength;
|
|
189
|
+
}
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
const EARLY_END_OF_STREAM_ERR_STR = `Unexpected end of stream`;
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* This returns a promise of bytes, read from a given stream.
|
|
197
|
+
* Given stream will be paused, when bytes are read. Beware.
|
|
198
|
+
* @param stream
|
|
199
|
+
* @param bytesToRead is a number of bytes to read from a stream. Error is
|
|
200
|
+
* thrown, if stream ends too early.
|
|
201
|
+
*/
|
|
202
|
+
function readChunkFrom(
|
|
203
|
+
stream: ReadableStream, bytesToRead: number
|
|
204
|
+
): Promise<Uint8Array> {
|
|
205
|
+
if (bytesToRead < 1) {
|
|
206
|
+
throw new Error(`Illegal number of bytes to read from stream: ${bytesToRead}`);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
const buffer = new BytesFIFOBuffer();
|
|
210
|
+
let deferred: Deferred<Uint8Array>|undefined = defer<Uint8Array>();
|
|
211
|
+
|
|
212
|
+
const complete = (bytes?: Uint8Array, err?: any) => {
|
|
213
|
+
if (!deferred) { return; }
|
|
214
|
+
if (bytes) {
|
|
215
|
+
deferred.resolve(bytes);
|
|
216
|
+
} else {
|
|
217
|
+
deferred.reject(err);
|
|
218
|
+
buffer.clear();
|
|
219
|
+
}
|
|
220
|
+
deferred = undefined;
|
|
221
|
+
stream.removeListener('data', onData);
|
|
222
|
+
stream.removeListener('error', onError);
|
|
223
|
+
stream.removeListener('end', onEnd);
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
const onData = (data: Buffer) => {
|
|
227
|
+
if (!deferred) { return; }
|
|
228
|
+
buffer.push(data);
|
|
229
|
+
if (buffer.length < bytesToRead) { return; }
|
|
230
|
+
stream.pause();
|
|
231
|
+
complete(buffer.getBytes(bytesToRead));
|
|
232
|
+
if (buffer.length === 0) { return; }
|
|
233
|
+
const bytesToUnshift = buffer.getBytes(undefined)!;
|
|
234
|
+
stream.unshift(Buffer.from(
|
|
235
|
+
bytesToUnshift.buffer as ArrayBuffer, bytesToUnshift.byteOffset, bytesToUnshift.length));
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
const onEnd = () => {
|
|
239
|
+
if (!deferred) { return; }
|
|
240
|
+
complete(undefined, EARLY_END_OF_STREAM_ERR_STR);
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
const onError = (err?: any) => {
|
|
244
|
+
if (!deferred) { return; }
|
|
245
|
+
complete(undefined, err);
|
|
246
|
+
};
|
|
247
|
+
|
|
248
|
+
stream.on('data', onData);
|
|
249
|
+
stream.on('error', onError);
|
|
250
|
+
stream.on('end', onEnd);
|
|
251
|
+
|
|
252
|
+
return deferred.promise;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
function noop() {}
|
|
256
|
+
|
|
257
|
+
Object.freeze(exports);
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright (C) 2015 - 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 { RequestHandler } from 'express';
|
|
19
|
+
import { SC as storeSC } from '../../resources/users';
|
|
20
|
+
import { sessionParams as api, ERR_SC } from '../../../lib-common/service-api/3nstorage/owner';
|
|
21
|
+
import { stringToNumOfBytes } from '../../../lib-server/conf-util';
|
|
22
|
+
import { Request } from '../../resources/sessions';
|
|
23
|
+
|
|
24
|
+
export function sessionParams(maxChunk: number|string): RequestHandler {
|
|
25
|
+
const maxChunkSize = stringToNumOfBytes(maxChunk);
|
|
26
|
+
|
|
27
|
+
return async (req: Request, res, next) => {
|
|
28
|
+
|
|
29
|
+
// XXX currently session params are same for all, hence, userId is unused, but, this whole
|
|
30
|
+
// thing must be within a session
|
|
31
|
+
const userId = req.session.params.userId;
|
|
32
|
+
|
|
33
|
+
try {
|
|
34
|
+
const reply: api.Reply = { maxChunkSize };
|
|
35
|
+
res.status(api.SC.ok).json(reply);
|
|
36
|
+
} catch (err) {
|
|
37
|
+
if ("string" !== typeof err) {
|
|
38
|
+
next(err);
|
|
39
|
+
} else if (err === storeSC.USER_UNKNOWN) {
|
|
40
|
+
res.status(ERR_SC.server).send("Recipient disappeared from the system.");
|
|
41
|
+
req.session.close();
|
|
42
|
+
} else {
|
|
43
|
+
next(new Error("Unhandled storage error code: "+err));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
Object.freeze(exports);
|
|
@@ -0,0 +1,43 @@
|
|
|
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 * as express from 'express';
|
|
19
|
+
import { json as parseJSON } from '../lib-server/middleware/body-parsers';
|
|
20
|
+
import { Factory as UsersFactory } from './resources/users';
|
|
21
|
+
import { SessionsFactory } from './resources/sessions';
|
|
22
|
+
//import * as api from '../../lib-common/service-api/3nstorage/shared';
|
|
23
|
+
|
|
24
|
+
export function makeSharedStorageApp(
|
|
25
|
+
sessions: SessionsFactory, users: UsersFactory
|
|
26
|
+
): express.Express {
|
|
27
|
+
|
|
28
|
+
const app = express();
|
|
29
|
+
app.disable('etag');
|
|
30
|
+
|
|
31
|
+
// TODO add sharing routes with proper session creation for authorities/capabilities
|
|
32
|
+
// If capacity needs only PKL entry, then manipulations can be done anonymously.
|
|
33
|
+
// If in addition to PKL, MailerId is required, then it sort of let's server
|
|
34
|
+
// protect against loosing capabilities by user's peers, but at a cost of
|
|
35
|
+
// anonymity.
|
|
36
|
+
// Should we allow MailerId-only authenticating capabilities? No,
|
|
37
|
+
// since sharing peer will anyway need to have a file to store long names
|
|
38
|
+
// and file keys.
|
|
39
|
+
|
|
40
|
+
return app;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
Object.freeze(exports);
|