gina 0.5.25 → 0.5.26
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/CHANGELOG.md +17 -0
- package/README.md +22 -15
- package/ROADMAP.md +4 -3
- package/bin/cli +22 -1
- package/bin/cmd +11 -1
- package/bin/gina-init +1 -0
- package/framework/v0.5.26/VERSION +1 -0
- package/framework/{v0.5.25 → v0.5.26}/core/asset/plugin/dist/vendor/gina/js/gina.js +10 -6
- package/framework/{v0.5.25 → v0.5.26}/core/config.js +29 -5
- package/framework/{v0.5.25 → v0.5.26}/core/connectors/couchbase/index.js +48 -3
- package/framework/{v0.5.25 → v0.5.26}/core/controller/controller.render-json.js +4 -0
- package/framework/{v0.5.25 → v0.5.26}/core/controller/controller.render-nunjucks.js +4 -0
- package/framework/{v0.5.25 → v0.5.26}/core/controller/controller.render-swig.js +4 -0
- package/framework/{v0.5.25 → v0.5.26}/core/server.isaac.js +12 -0
- package/framework/{v0.5.25 → v0.5.26}/core/server.js +235 -1
- package/framework/{v0.5.25 → v0.5.26}/core/template/conf/settings.json +36 -0
- package/framework/{v0.5.25 → v0.5.26}/lib/authz-gate/src/main.js +169 -2
- package/framework/{v0.5.25 → v0.5.26}/lib/cmd/bundle/arguments.json +1 -0
- package/framework/{v0.5.25 → v0.5.26}/lib/cmd/bundle/help.txt +19 -6
- package/framework/{v0.5.25 → v0.5.26}/lib/cmd/bundle/mcp-start.js +47 -5
- package/framework/{v0.5.25 → v0.5.26}/lib/cmd/bundle/openapi.js +37 -4
- package/framework/{v0.5.25 → v0.5.26}/lib/cmd/framework/init.js +28 -1
- package/framework/{v0.5.25 → v0.5.26}/lib/cmd/framework/set.js +5 -0
- package/framework/{v0.5.25 → v0.5.26}/lib/connector-error/src/main.js +8 -4
- package/framework/{v0.5.25 → v0.5.26}/lib/logger/src/containers/mq/listener.js +32 -2
- package/framework/{v0.5.25 → v0.5.26}/lib/mcp-http/src/main.js +110 -11
- package/framework/{v0.5.25 → v0.5.26}/lib/merge/src/main.js +10 -6
- package/framework/{v0.5.25 → v0.5.26}/package.json +1 -1
- package/gna.js +4 -4
- package/llms.txt +10 -5
- package/package.json +3 -3
- package/resources/home/settings.json +1 -0
- package/schema/routing.json +20 -0
- package/schema/settings.json +13 -0
- package/utils/helper.js +1 -1
- package/framework/v0.5.25/VERSION +0 -1
- /package/framework/{v0.5.25 → v0.5.26}/AUTHORS +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/LICENSE +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/asset/html/nolayout.html +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/asset/html/static.html +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/asset/img/android-chrome-192x192.png +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/asset/img/android-chrome-512x512.png +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/asset/img/apple-touch-icon.png +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/asset/img/favicon-16x16.png +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/asset/img/favicon-32x32.png +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/asset/img/favicon.ico +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/asset/plugin/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/asset/plugin/dist/vendor/gina/js/gina.min.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/connectors/ai/index.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/connectors/ai/lib/connector.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/connectors/couchbase/lib/connector.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/connectors/couchbase/lib/connector.v3.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/connectors/couchbase/lib/connector.v4.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/connectors/couchbase/lib/n1ql.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/connectors/couchbase/lib/session-store.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/connectors/couchbase/lib/session-store.v4.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/connectors/mongodb/index.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/connectors/mongodb/lib/connector.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/connectors/mongodb/lib/job-store.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/connectors/mongodb/lib/pipeline-loader.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/connectors/mongodb/lib/session-store.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/connectors/mysql/index.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/connectors/mysql/lib/connector.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/connectors/postgresql/index.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/connectors/postgresql/lib/connector.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/connectors/redis/index.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/connectors/redis/lib/connector.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/connectors/redis/lib/job-store.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/connectors/redis/lib/render-cache-store.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/connectors/redis/lib/session-store.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/connectors/scylladb/index.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/connectors/scylladb/lib/connector.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/connectors/scylladb/lib/session-store.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/connectors/sql-parser.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/connectors/sqlite/index.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/connectors/sqlite/lib/connector.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/connectors/sqlite/lib/job-store.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/connectors/sqlite/lib/session-store.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/content.encoding +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/controller/controller.framework.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/controller/controller.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/controller/controller.render-nunjucks-async.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/controller/controller.render-stream.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/controller/controller.render-swig-async.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/controller/controller.render-v1.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/controller/index.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/controller/inspector-window-emit.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/controller/release-banner.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/dev/index.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/dev/lib/class.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/dev/lib/factory.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/dev/lib/tools.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/gna.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/locales/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/locales/currency.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/locales/dist/language/en.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/locales/dist/language/fr.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/locales/dist/region/en.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/locales/dist/region/fr.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/locales/index.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/mime.types +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/model/entity.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/model/index.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/model/template/entityFactory.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/model/template/index.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/index.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/csrf/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/csrf/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/csrf/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/coep/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/coep/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/coep/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/coop/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/coop/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/coop/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/corp/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/corp/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/corp/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/csp/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/csp/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/csp/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/hide-powered-by/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/hide-powered-by/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/hide-powered-by/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/hsts/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/hsts/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/hsts/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/origin-agent-cluster/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/origin-agent-cluster/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/origin-agent-cluster/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/referrer-policy/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/referrer-policy/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/referrer-policy/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/x-content-type-options/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/x-content-type-options/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/x-content-type-options/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/x-dns-prefetch-control/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/x-dns-prefetch-control/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/x-dns-prefetch-control/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/x-download-options/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/x-download-options/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/x-download-options/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/x-frame-options/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/x-frame-options/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/x-frame-options/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/x-xss-protection/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/x-xss-protection/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/security-headers/x-xss-protection/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/session/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/session/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/session/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/storage/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/storage/build.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/storage/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/storage/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/validator/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/validator/build.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/validator/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/validator/src/form-validator.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/plugins/lib/validator/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/router.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/server.express.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/status.codes +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/_gitignore +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/boilerplate/bundle/config/app.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/boilerplate/bundle/config/connectors.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/boilerplate/bundle/config/routing.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/boilerplate/bundle/config/settings.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/boilerplate/bundle/config/templates.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/boilerplate/bundle/config/watchers.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/boilerplate/bundle/index.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/boilerplate/bundle/locales/en.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/boilerplate/bundle_public/css/default.css +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/boilerplate/bundle_public/css/home.css +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/boilerplate/bundle_public/js/components/x-checklist.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/boilerplate/bundle_public/manifest.webmanifest +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/boilerplate/bundle_public/readme.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/boilerplate/bundle_public/sw.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/boilerplate/bundle_templates/html/includes/x-checklist.html +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/command/gina.bat.tpl +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/command/gina.tpl +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/conf/env.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/conf/manifest.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/conf/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/conf/statics.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/conf/templates.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/error/client/json/401.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/error/client/json/403.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/error/client/json/404.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/error/server/html/50x.html +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/error/server/json/500.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/error/server/json/503.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/core/template/extensions/logger/config.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/helpers/console.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/helpers/context.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/helpers/data/LICENSE +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/helpers/data/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/helpers/data/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/helpers/data/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/helpers/dateFormat.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/helpers/index.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/helpers/json/LICENSE +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/helpers/json/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/helpers/json/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/helpers/json/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/helpers/path.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/helpers/plugins/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/helpers/plugins/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/helpers/plugins/src/api-error.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/helpers/plugins/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/helpers/prototypes.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/helpers/task.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/helpers/text.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/admin/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/admin/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/archiver/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/archiver/build.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/archiver/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/archiver/src/dep/jszip.min.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/archiver/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/async/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/async/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/audit/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/audit/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/audit-store.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/authz-gate/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cache/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cache/build.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cache/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cache/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/aliases.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/bundle/add.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/bundle/build.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/bundle/copy.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/bundle/cp.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/bundle/help.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/bundle/inc/name-rewrite.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/bundle/list.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/bundle/man.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/bundle/mcp.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/bundle/oas.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/bundle/remove.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/bundle/rename.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/bundle/restart.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/bundle/rm.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/bundle/start.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/bundle/status.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/bundle/stop.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/bundle/types.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/cache/arguments.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/cache/clear.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/cache/help.txt +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/cache/stats.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/connector/add.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/connector/arguments.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/connector/help.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/connector/help.txt +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/connector/infer.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/connector/list.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/connector/migrate.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/connector/models.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/connector/remove.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/connector/rm.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/connector/test.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/container/arguments.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/container/help.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/container/help.txt +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/container/man.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/container/ps.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/container/stop.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/controller/add.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/controller/arguments.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/controller/help.txt +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/controller/inc/args.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/controller/inc/namespace.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/controller/inc/reference-rewrite.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/controller/inc/reference-scan.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/controller/inc/scaffold.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/controller/remove.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/controller/rename.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/controller/rm.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/env/add.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/env/get.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/env/help.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/env/help.txt +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/env/link-dev.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/env/list.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/env/remove.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/env/rm.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/env/set.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/env/unset.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/env/use.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/framework/add.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/framework/arguments.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/framework/build.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/framework/dot.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/framework/get.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/framework/help.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/framework/help.txt +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/framework/link-node-modules.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/framework/link.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/framework/list.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/framework/man.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/framework/msg.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/framework/open.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/framework/remove.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/framework/reset.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/framework/restart.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/framework/start.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/framework/status.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/framework/stop.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/framework/tail.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/framework/update.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/framework/version.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/gina-dev.1.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/gina-framework.1.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/gina.1.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/helper.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/i18n/add.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/i18n/arguments.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/i18n/export.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/i18n/help.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/i18n/help.txt +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/i18n/import.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/i18n/scan.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/image/_host.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/image/arguments.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/image/build.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/image/help.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/image/help.txt +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/image/list.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/image/man.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/image/rm.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/image/run.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/index.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/inspector/help.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/inspector/help.txt +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/inspector/open.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/man-render.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/minion/arguments.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/minion/help.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/minion/help.txt +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/minion/kill.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/minion/list.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/msg.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/port/help.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/port/help.txt +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/port/inc/scan.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/port/list.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/port/reset.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/port/set.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/project/add.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/project/arguments.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/project/backup.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/project/build.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/project/help.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/project/help.txt +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/project/import.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/project/list.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/project/man.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/project/move.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/project/remove.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/project/rename.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/project/restart.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/project/restore.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/project/rm.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/project/start.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/project/status.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/project/stop.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/protocol/arguments.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/protocol/help.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/protocol/help.txt +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/protocol/list.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/protocol/remove.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/protocol/set.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/scope/add.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/scope/help.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/scope/help.txt +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/scope/link-local.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/scope/link-production.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/scope/list.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/scope/remove.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/scope/rm.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/scope/use.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/secrets/arguments.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/secrets/check.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/secrets/help.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/secrets/help.txt +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/secrets/scan.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/service/help.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/service/help.txt +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/service/list.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/service/man.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/service/start.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd/view/add.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd-status-format/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cmd-status-format/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/collection/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/collection/build.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/collection/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/collection/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/config.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/connector-config/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/connector-config/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/connector-error/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/connector-registry/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/connector-registry/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cron/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cron/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/cron/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/domain/LICENSE +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/domain/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/domain/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/domain/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/dto/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/dto/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/dto-pipe/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/dto-pipe/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/dto-types/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/dto-types/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/generator/index.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/i18n/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/i18n/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/image-build/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/image-build/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/index.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/inherits/LICENSE +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/inherits/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/inherits/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/inherits/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/inspector-events/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/inspector-events/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/inspector-redact/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/inspector-redact/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/instrument/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/instrument/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/job/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/job/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/job-store.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/json-config-header/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/json-config-header/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/logger/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/logger/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/logger/src/containers/default/index.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/logger/src/containers/file/index.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/logger/src/containers/mq/index.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/logger/src/containers/mq/speaker.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/logger/src/helper.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/logger/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/math/index.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/mcp-dispatch/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/mcp-dispatch/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/mcp-http/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/mcp-server/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/mcp-server/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/merge/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/merge/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/metrics/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/metrics/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/model.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/nunjucks-filters/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/nunjucks-filters/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/nunjucks-filters/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/nunjucks-resolver/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/nunjucks-resolver/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/proc.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/release-watch/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/release-watch/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/render-cache/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/render-cache/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/render-cache-store.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/routing/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/routing/build.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/routing/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/routing/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/routing/src/radix.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/routing-introspect/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/routing-introspect/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/secrets/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/secrets/src/backends/env.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/secrets/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/session-store.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/shell.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/state.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/swig-filters/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/swig-filters/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/swig-filters/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/swig-resolver/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/swig-resolver/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/template-loaders/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/template-loaders/src/loaders/http.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/template-loaders/src/loaders/memory.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/template-loaders/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/url/README.md +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/url/index.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/url/routing.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/uuid/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/uuid/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/validator.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/watcher/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/watcher/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/ws-framing/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/ws-framing/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/ws-query/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/ws-query/src/main.js +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/ws-session/package.json +0 -0
- /package/framework/{v0.5.25 → v0.5.26}/lib/ws-session/src/main.js +0 -0
|
@@ -702,7 +702,13 @@ function Server(options) {
|
|
|
702
702
|
isCacheless : options.conf[self.appName][self.env].isCacheless,
|
|
703
703
|
routing : options.conf[self.appName][self.env].routing,
|
|
704
704
|
allRoutes : options.conf.routing,
|
|
705
|
-
cachePath : options.conf[self.appName][self.env].cachePath
|
|
705
|
+
cachePath : options.conf[self.appName][self.env].cachePath,
|
|
706
|
+
// #COMPLY9 — the transport-posture knobs resolve exactly like
|
|
707
|
+
// `scheme` itself: the bundle's settings (already seeded into
|
|
708
|
+
// serverOpt above) win, and these fills give env.json's
|
|
709
|
+
// per-env `server` block a voice when settings are silent.
|
|
710
|
+
requireHttps : options.conf[self.appName][self.env].server.requireHttps,
|
|
711
|
+
allowInsecure : options.conf[self.appName][self.env].server.allowInsecure
|
|
706
712
|
}
|
|
707
713
|
);
|
|
708
714
|
|
|
@@ -918,10 +924,28 @@ function Server(options) {
|
|
|
918
924
|
throw new Error('[ SERVER ] `settings.json > auth` must be an object.');
|
|
919
925
|
}
|
|
920
926
|
|
|
927
|
+
// #COMPLY10 — deny-by-default authorization: an un-annotated route is GATED
|
|
928
|
+
// rather than open, and opts back out with `param.public: true`. Read HERE,
|
|
929
|
+
// before the per-route loop, because two of that loop's refusals only apply
|
|
930
|
+
// while the mode is on. Strict boolean for the same reason as every sibling
|
|
931
|
+
// flag in this block: a truthy string would leave every un-annotated route
|
|
932
|
+
// silently UNGATED while the operator believes the bundle is deny-by-default
|
|
933
|
+
// — the quietly-OFF class this whole block exists to refuse.
|
|
934
|
+
var _authzDefaultDeny = false;
|
|
935
|
+
if ( typeof(_authzSettings.requireAuthByDefault) != 'undefined' ) {
|
|
936
|
+
if ( typeof(_authzSettings.requireAuthByDefault) != 'boolean' ) {
|
|
937
|
+
throw new Error('[ SERVER ] `settings.json > auth.requireAuthByDefault` must be a boolean — got '+ JSON.stringify(_authzSettings.requireAuthByDefault) +'. A truthy string would leave every un-annotated route silently UNGATED, so the boot refuses instead.');
|
|
938
|
+
}
|
|
939
|
+
_authzDefaultDeny = _authzSettings.requireAuthByDefault;
|
|
940
|
+
}
|
|
941
|
+
|
|
921
942
|
var _authzSrcPath = self.conf[self.appName][self.env].bundlesPath + '/' + self.appName;
|
|
922
943
|
var _authzCount = 0;
|
|
923
944
|
var _authzRolesCount = 0;
|
|
924
945
|
var _authzPolicyCount = 0;
|
|
946
|
+
var _authzPublicCount = 0;
|
|
947
|
+
var _authzDefaultGatedCount = 0;
|
|
948
|
+
var _authzWsUngated = []; // #B159 — ws routes the mode would otherwise count as gated
|
|
925
949
|
for (var _authzRule in _authzRouting) {
|
|
926
950
|
var _authzRoute = _authzRouting[_authzRule];
|
|
927
951
|
if ( typeof(_authzRoute) != 'object' || _authzRoute === null || !_authzRoute.param ) {
|
|
@@ -983,6 +1007,84 @@ function Server(options) {
|
|
|
983
1007
|
_authzGated = true;
|
|
984
1008
|
++_authzPolicyCount;
|
|
985
1009
|
}
|
|
1010
|
+
// #B159 — a WebSocket route can declare an authorization key, but nothing
|
|
1011
|
+
// can ever enforce it. A `method: "ws"` route is registered on the engine's
|
|
1012
|
+
// extended-CONNECT handler and never reaches `handle()` / `router.route`,
|
|
1013
|
+
// which is where `lib/authz-gate` runs — so the gate is not merely skipped,
|
|
1014
|
+
// it is unreachable by construction. Left accepted, the route would lint
|
|
1015
|
+
// clean, boot, AND be counted in the "Registered N authorization-gated
|
|
1016
|
+
// route(s)" line below: the framework would actively confirm an illusion.
|
|
1017
|
+
// That is precisely the quietly-OFF class the rest of this block refuses
|
|
1018
|
+
// (a truthy-string `requireAuth` already refuses to boot), so a
|
|
1019
|
+
// structurally unenforceable one must refuse too. `/^ws$/i` is the SAME
|
|
1020
|
+
// predicate the ws registration uses, so the two can never disagree about
|
|
1021
|
+
// what a ws route is. Placed after the requireAuth/roles/policy blocks so
|
|
1022
|
+
// `_authzGated` is already final and one check covers all three keys.
|
|
1023
|
+
if ( _authzGated && /^ws$/i.test(_authzRoute.method || '') ) {
|
|
1024
|
+
throw new Error('[ SERVER ] Route `'+ _authzRule +'`: it is a `method: "ws"` route, so `param.requireAuth` / `param.roles` / `param.policy` can never be enforced on it — a WebSocket handshake is answered by the engine\'s extended-CONNECT handler and never reaches the authorization gate. Authenticate inside the `wsHandler` instead: it receives the full request, so it can inspect headers and cookies and close the socket itself. Remove the authorization key to make that explicit.');
|
|
1025
|
+
}
|
|
1026
|
+
// #COMPLY10 — `param.public`: the explicit exemption from
|
|
1027
|
+
// `auth.requireAuthByDefault`. Linted UNCONDITIONALLY, mode on or off:
|
|
1028
|
+
// a malformed exemption is an author error worth surfacing at the
|
|
1029
|
+
// deploy that INTRODUCES it, not at the later one that enables the mode
|
|
1030
|
+
// (the audit block's rationale below, applied here). Placed after the
|
|
1031
|
+
// requireAuth/roles/policy blocks so `_authzGated` is already final.
|
|
1032
|
+
if ( typeof(_authzRoute.param.public) != 'undefined' ) {
|
|
1033
|
+
if ( typeof(_authzRoute.param.public) != 'boolean' ) {
|
|
1034
|
+
throw new Error('[ SERVER ] Route `'+ _authzRule +'`: `param.public` must be a boolean (got `'+ typeof(_authzRoute.param.public) +'`). A truthy string would NOT exempt the route from `auth.requireAuthByDefault`.');
|
|
1035
|
+
}
|
|
1036
|
+
if ( _authzRoute.param.public === true ) {
|
|
1037
|
+
// Same axis, opposite answers. Neither reading is safe: honouring
|
|
1038
|
+
// `public` silently un-gates an explicitly gated route (fail-open),
|
|
1039
|
+
// and honouring the gate silently discards what the author wrote.
|
|
1040
|
+
// `roles` and `policy` both IMPLY `requireAuth`, so they collapse
|
|
1041
|
+
// into the same contradiction.
|
|
1042
|
+
if ( _authzGated ) {
|
|
1043
|
+
throw new Error('[ SERVER ] Route `'+ _authzRule +'`: `param.public: true` contradicts `param.requireAuth` / `param.roles` / `param.policy` on the same route — it cannot be both exempt from authentication and gated by it. Drop one.');
|
|
1044
|
+
}
|
|
1045
|
+
++_authzPublicCount;
|
|
1046
|
+
}
|
|
1047
|
+
}
|
|
1048
|
+
// #B158 — a GATED route must not also be cached, however it is gated.
|
|
1049
|
+
// Both render-cache serve points run BEFORE the authorization gate: the
|
|
1050
|
+
// engine-agnostic read serves and RETURNS ahead of `router.route` (inside
|
|
1051
|
+
// which the gate runs), and isaac's runs pre-routing, before `req.routing`
|
|
1052
|
+
// even exists — so neither can consult authorization even in principle.
|
|
1053
|
+
// The key is `<release>:<kind>:<bundle>:<url>` with no principal component,
|
|
1054
|
+
// so a cached gated route replays the first authenticated caller's rendered
|
|
1055
|
+
// body to every later anonymous one. Measured live on an isolated boot: a
|
|
1056
|
+
// Bearer-authenticated render was served verbatim, same body and same
|
|
1057
|
+
// render nonce, to the next unauthenticated caller, while the identical
|
|
1058
|
+
// route WITHOUT `cache` correctly answered 401.
|
|
1059
|
+
//
|
|
1060
|
+
// #COMPLY10 shipped this refusal scoped to MODE-gated routes only, so that
|
|
1061
|
+
// enabling the mode could not break a working bundle; the explicitly
|
|
1062
|
+
// annotated case it deliberately left open is the pre-existing hole, and
|
|
1063
|
+
// closing it here is what #B158 is. Explicitly gated + cached is therefore
|
|
1064
|
+
// now refused in BOTH modes.
|
|
1065
|
+
var _authzRouteGated = _authzGated || ( _authzDefaultDeny && _authzRoute.param.public !== true );
|
|
1066
|
+
if (
|
|
1067
|
+
_authzRouteGated
|
|
1068
|
+
&& typeof(_authzRoute.cache) != 'undefined'
|
|
1069
|
+
&& _authzRoute.cache
|
|
1070
|
+
) {
|
|
1071
|
+
throw new Error('[ SERVER ] Route `'+ _authzRule +'`: '+ ( _authzGated ? '`param.requireAuth` / `param.roles` / `param.policy` gate this route' : '`auth.requireAuthByDefault` gates this route' ) +', but it also declares `cache`. The render cache is read BEFORE authorization runs and its key carries no user identity, so the first authenticated response would be replayed to unauthenticated callers. Drop `cache`'+ ( _authzGated ? ', or remove the authorization keys if the route is meant to be open to everyone.' : ', or mark the route `"public": true` if it is meant to be cacheable and open.' ));
|
|
1072
|
+
}
|
|
1073
|
+
if ( _authzDefaultDeny && !_authzGated && _authzRoute.param.public !== true ) {
|
|
1074
|
+
// #B159 — the mode cannot gate a ws route either (same unreachable
|
|
1075
|
+
// gate). Counting one would repeat the illusion the explicit refusal
|
|
1076
|
+
// above exists to stop, so ws routes are excluded from the tally and
|
|
1077
|
+
// named once instead. A WARN rather than a refusal on purpose: an
|
|
1078
|
+
// explicit key is an author asserting something false, whereas the
|
|
1079
|
+
// mode sweeps up every un-annotated route, so refusing here would
|
|
1080
|
+
// break a working ws bundle the moment the mode is switched on — the
|
|
1081
|
+
// exact regression #COMPLY10 was scoped to avoid.
|
|
1082
|
+
if ( /^ws$/i.test(_authzRoute.method || '') ) {
|
|
1083
|
+
_authzWsUngated.push(_authzRule);
|
|
1084
|
+
} else {
|
|
1085
|
+
++_authzDefaultGatedCount;
|
|
1086
|
+
}
|
|
1087
|
+
}
|
|
986
1088
|
if ( _authzGated ) {
|
|
987
1089
|
++_authzCount;
|
|
988
1090
|
}
|
|
@@ -1025,6 +1127,46 @@ function Server(options) {
|
|
|
1025
1127
|
_authzLoginRoute = _authzPath;
|
|
1026
1128
|
}
|
|
1027
1129
|
|
|
1130
|
+
// #COMPLY10 — the lockout check. Under deny-by-default a login route that
|
|
1131
|
+
// is not itself exempt bounces to ITSELF: the gate 302s an unauthenticated
|
|
1132
|
+
// caller to the login page, which is gated, which 302s again — the browser
|
|
1133
|
+
// gives up with ERR_TOO_MANY_REDIRECTS and the bundle has locked out every
|
|
1134
|
+
// visitor. It is statically detectable, so it refuses at boot rather than
|
|
1135
|
+
// at the first visitor — the same trade this block already makes for a
|
|
1136
|
+
// non-boolean `requireAuth` (one deploy-time error instead of a production
|
|
1137
|
+
// incident).
|
|
1138
|
+
if ( _authzDefaultDeny ) {
|
|
1139
|
+
if ( !_authzLoginRoute ) {
|
|
1140
|
+
// Legal and coherent for a pure API / machine-caller bundle (#MS3):
|
|
1141
|
+
// with no bounce target every unauthenticated request simply gets a
|
|
1142
|
+
// 401, which is the correct answer for a service. Warn, never refuse
|
|
1143
|
+
// — the `auth.machine.enabled`-with-no-callers precedent below:
|
|
1144
|
+
// legal, but worth seeing at boot.
|
|
1145
|
+
console.warn('[ SERVER ] `auth.requireAuthByDefault` is true and no `auth.loginRoute` is configured — every unauthenticated request to an un-annotated route gets a 401. Correct for an API bundle; a browser-facing bundle almost certainly wants a login route.');
|
|
1146
|
+
} else {
|
|
1147
|
+
var _authzLoginTarget = null;
|
|
1148
|
+
for (var _authzLr in _authzRouting) {
|
|
1149
|
+
var _authzLrRoute = _authzRouting[_authzLr];
|
|
1150
|
+
if ( typeof(_authzLrRoute) != 'object' || _authzLrRoute === null || typeof(_authzLrRoute.url) != 'string' ) {
|
|
1151
|
+
continue;
|
|
1152
|
+
}
|
|
1153
|
+
// `url` may carry the `,`-separated multi-url form (config.js
|
|
1154
|
+
// writes it for the webroot auto-redirect), so a match on any
|
|
1155
|
+
// member counts.
|
|
1156
|
+
if ( _authzLrRoute.url.split(',').indexOf(_authzLoginRoute) > -1 ) {
|
|
1157
|
+
_authzLoginTarget = _authzLrRoute;
|
|
1158
|
+
break;
|
|
1159
|
+
}
|
|
1160
|
+
}
|
|
1161
|
+
if ( !_authzLoginTarget ) {
|
|
1162
|
+
throw new Error('[ SERVER ] `auth.requireAuthByDefault` is true, but `auth.loginRoute` (`'+ _authzLoginRoute +'`) does not resolve to a route this bundle declares, so the boot cannot verify the login page is reachable without authenticating. Under deny-by-default an unverifiable login target is exactly the config that locks every visitor out — point `auth.loginRoute` at a routing.json rule name.');
|
|
1163
|
+
}
|
|
1164
|
+
if ( !_authzLoginTarget.param || _authzLoginTarget.param.public !== true ) {
|
|
1165
|
+
throw new Error('[ SERVER ] `auth.requireAuthByDefault` is true, but the login route (`'+ _authzLoginRoute +'`) is not marked `"public": true`. The mode would gate it, so an unauthenticated visitor is bounced to the login page, which bounces again — an infinite redirect that locks out every visitor. Add `"public": true` to that route\'s `param`.');
|
|
1166
|
+
}
|
|
1167
|
+
}
|
|
1168
|
+
}
|
|
1169
|
+
|
|
1028
1170
|
// #MS3 — machine-caller authentication: lint + precompute at BOOT.
|
|
1029
1171
|
// `settings.json > auth.machine` declares named machine callers
|
|
1030
1172
|
// (services, job runners, external systems) whose
|
|
@@ -1113,7 +1255,22 @@ function Server(options) {
|
|
|
1113
1255
|
console.warn('[ SERVER ] `auth.machine.enabled` is true but `auth.machine.callers` declares no caller and no `authenticator` is named — machine authentication is ON but can admit nobody.');
|
|
1114
1256
|
}
|
|
1115
1257
|
}
|
|
1258
|
+
// #COMPLY10 — the per-bundle posture map. MERGED mode runs every bundle of a
|
|
1259
|
+
// project in ONE process and this write happens once per init(), so a FLAT
|
|
1260
|
+
// mode flag would be decided by whichever bundle booted LAST: a bundle that
|
|
1261
|
+
// opted into deny-by-default would silently un-gate every one of its routes
|
|
1262
|
+
// the moment a sibling booted without the key. That is a fail-OPEN, and an
|
|
1263
|
+
// invisible one — the single failure direction this control must not have.
|
|
1264
|
+
// Reading the existing map first preserves what earlier bundles wrote.
|
|
1265
|
+
// (`loginRoute` / `machine` stay flat — pre-existing behaviour, untouched.)
|
|
1266
|
+
var _authzByBundle = (
|
|
1267
|
+
process.gina._authConf
|
|
1268
|
+
&& process.gina._authConf.byBundle
|
|
1269
|
+
&& typeof(process.gina._authConf.byBundle) == 'object'
|
|
1270
|
+
) ? process.gina._authConf.byBundle : {};
|
|
1271
|
+
_authzByBundle[self.appName] = { requireAuthByDefault: _authzDefaultDeny };
|
|
1116
1272
|
process.gina._authConf = { loginRoute: _authzLoginRoute, machine: _authzMachine };
|
|
1273
|
+
process.gina._authConf.byBundle = _authzByBundle;
|
|
1117
1274
|
if ( _authzMachine.enabled === true ) {
|
|
1118
1275
|
console.debug('[ BUNDLE ][ server ][ init ] Machine-caller authentication ENABLED — '+ Object.keys(_authzMachine.callers).length +' caller(s)'
|
|
1119
1276
|
+ ( _authzMachine.authenticator ? ' + authenticator `'+ _authzMachine.authenticator +'`' : '' )
|
|
@@ -1128,6 +1285,17 @@ function Server(options) {
|
|
|
1128
1285
|
+' for [ '+ self.appName +' ]'
|
|
1129
1286
|
+ ( _authzLoginRoute ? ' — login bounce: '+ _authzLoginRoute : ' — no `auth.loginRoute`: unauthenticated requests get a 401' ));
|
|
1130
1287
|
}
|
|
1288
|
+
if ( _authzDefaultDeny ) {
|
|
1289
|
+
// console.info, NOT console.debug — the shipped default log_level filters
|
|
1290
|
+
// debug, and under a mode that can lock a bundle out, the count of newly
|
|
1291
|
+
// gated routes is the single number an operator needs confirmed at deploy.
|
|
1292
|
+
console.info('[ BUNDLE ][ server ][ init ] Deny-by-default authorization ENABLED for [ '+ self.appName +' ] — '+ _authzDefaultGatedCount +' un-annotated route(s) now require authentication, '+ _authzPublicCount +' marked `public`');
|
|
1293
|
+
// #B159 — say plainly which routes the mode does NOT reach. Silence here
|
|
1294
|
+
// would read as "everything is gated now", which is the whole failure mode.
|
|
1295
|
+
if ( _authzWsUngated.length > 0 ) {
|
|
1296
|
+
console.warn('[ BUNDLE ][ server ][ init ] `auth.requireAuthByDefault` does NOT cover '+ _authzWsUngated.length +' WebSocket route(s) — '+ _authzWsUngated.join(', ') +'. A ws handshake never reaches the authorization gate, so these stay open unless their `wsHandler` authenticates. Mark them `"public": true` once you have confirmed that is intended.');
|
|
1297
|
+
}
|
|
1298
|
+
}
|
|
1131
1299
|
|
|
1132
1300
|
// ── #COMPLY2 — audit trail: boot resolve + fail-fast lint ──
|
|
1133
1301
|
// Sibling of the #COMPLY1 registrar above and the #DTO2 registrar before
|
|
@@ -1335,6 +1503,72 @@ function Server(options) {
|
|
|
1335
1503
|
console.warn('[releaseWatch] init skipped: '+ (rwInitErr.stack || rwInitErr.message || rwInitErr));
|
|
1336
1504
|
}
|
|
1337
1505
|
|
|
1506
|
+
// ── #COMPLY9 — production transport posture (ZT2) ──────────────────
|
|
1507
|
+
// Outside the `local` scope a bundle resolving a cleartext scheme is
|
|
1508
|
+
// served exactly as configured — both engines' scheme switches default
|
|
1509
|
+
// to cleartext — so the posture is surfaced at boot instead of staying
|
|
1510
|
+
// invisible: warn by default, refuse when the operator asked for
|
|
1511
|
+
// enforcement, acknowledge when the operator asserted the boundary.
|
|
1512
|
+
//
|
|
1513
|
+
// server.requireHttps === true → REFUSE to boot a cleartext bundle
|
|
1514
|
+
// outside the local scope. The throw lands in this init() try,
|
|
1515
|
+
// whose catch emergs + flushes + exits BEFORE any listen() — the
|
|
1516
|
+
// same pre-listen principle as the MCP transport's fail-closed
|
|
1517
|
+
// start(): the cleartext port is never reachable at all.
|
|
1518
|
+
// server.allowInsecure === true → the operator's assertion that TLS
|
|
1519
|
+
// terminates upstream (mesh sidecar, ingress/LB, reverse proxy —
|
|
1520
|
+
// the documented h2c topology); the warn becomes one info line.
|
|
1521
|
+
// Same vocabulary and polarity as `mcp.json > server >
|
|
1522
|
+
// allowInsecure`.
|
|
1523
|
+
//
|
|
1524
|
+
// Both are strict booleans resolved like `scheme` itself (bundle
|
|
1525
|
+
// settings win, env.json's `server` block fills — the picked-keys
|
|
1526
|
+
// merge above). A non-boolean throws: a truthy string on
|
|
1527
|
+
// `requireHttps` would leave the transport silently UNENFORCED while
|
|
1528
|
+
// the operator believes otherwise — the quietly-OFF class the authz
|
|
1529
|
+
// lints above refuse (`auth.requireAuthByDefault` precedent). The
|
|
1530
|
+
// scope gate is NOT-local, never is-production: custom scopes (e.g. a
|
|
1531
|
+
// `beta`) are neither local nor production, and a production-keyed
|
|
1532
|
+
// gate would silently skip them — the same reasoning as the
|
|
1533
|
+
// stack-trace egress gate. `conf.server.scopeIsLocal` is deliberately
|
|
1534
|
+
// not used (it derives from projects.json `def_scope`, not the live
|
|
1535
|
+
// scope). The scheme test is `!== 'https'`, fail-closed: anything the
|
|
1536
|
+
// engines cannot positively recognise as https is served cleartext
|
|
1537
|
+
// (their scheme switches `default:` to the plain server).
|
|
1538
|
+
var _tpRequireHttps = serverOpt.requireHttps;
|
|
1539
|
+
var _tpAllowInsecure = serverOpt.allowInsecure;
|
|
1540
|
+
// Type lint first, scope-independent: settings.json boots every
|
|
1541
|
+
// scope, so the dev machine catches the typo before it ships.
|
|
1542
|
+
if ( typeof(_tpRequireHttps) != 'undefined' && typeof(_tpRequireHttps) != 'boolean' ) {
|
|
1543
|
+
throw new Error('[ SERVER ] `settings.json > server.requireHttps` must be a boolean — got '+ JSON.stringify(_tpRequireHttps) +'. A truthy string would leave the transport silently UNENFORCED, so the boot refuses instead.');
|
|
1544
|
+
}
|
|
1545
|
+
if ( typeof(_tpAllowInsecure) != 'undefined' && typeof(_tpAllowInsecure) != 'boolean' ) {
|
|
1546
|
+
throw new Error('[ SERVER ] `settings.json > server.allowInsecure` must be a boolean — got '+ JSON.stringify(_tpAllowInsecure) +'.');
|
|
1547
|
+
}
|
|
1548
|
+
if ( _tpRequireHttps === true && _tpAllowInsecure === true ) {
|
|
1549
|
+
throw new Error('[ SERVER ] `server.requireHttps` and `server.allowInsecure` are both true — they assert opposite postures (enforce https at this bundle vs TLS terminates upstream). Keep exactly one.');
|
|
1550
|
+
}
|
|
1551
|
+
if ( serverOpt.scheme !== 'https' && !self.isLocalScope() ) {
|
|
1552
|
+
if ( _tpRequireHttps === true ) {
|
|
1553
|
+
throw new Error('[ SERVER ] `server.requireHttps` is true, but bundle `'+ self.appName +'` resolves scheme `'+ serverOpt.scheme +'` in scope `'+ self.scope +'` — the listener would serve cleartext outside the local scope, which is exactly what this knob refuses (the refusal is pre-listen: nothing binds). Switch the bundle to https (`settings.json > server.scheme: "https"` + `server.credentials`), or — if TLS terminates upstream (mesh, ingress, reverse proxy) — replace `requireHttps` with `server.allowInsecure: true`.');
|
|
1554
|
+
}
|
|
1555
|
+
if ( _tpAllowInsecure === true ) {
|
|
1556
|
+
console.info('[ BUNDLE ][ server ][ init ] transport posture: scheme `'+ serverOpt.scheme +'` in scope `'+ self.scope +'` — allowInsecure asserted (TLS terminates upstream).');
|
|
1557
|
+
} else {
|
|
1558
|
+
// proxy.json is advisory only — an https:// upstream hostname
|
|
1559
|
+
// for this scope+env strongly suggests TLS terminates there,
|
|
1560
|
+
// but only the explicit `allowInsecure` assertion silences
|
|
1561
|
+
// the warn (a reviewer can tell an audited acknowledgment
|
|
1562
|
+
// from a leftover; the #COMPLY10 `public`-marker rationale).
|
|
1563
|
+
var _tpProxyNote = ( typeof(process.gina.PROXY_HOSTNAME) != 'undefined' && /^https:\/\//i.test(process.gina.PROXY_HOSTNAME) )
|
|
1564
|
+
? ' proxy.json declares `'+ process.gina.PROXY_HOSTNAME +'` for this scope+env, so TLS likely terminates there.'
|
|
1565
|
+
: '';
|
|
1566
|
+
console.warn('[ BUNDLE ][ server ][ init ] transport posture: bundle `'+ self.appName +'` serves plain `'+ serverOpt.scheme +'` in scope `'+ self.scope +'` — the transport at this listener is cleartext.'+ _tpProxyNote +' If TLS terminates upstream (mesh, ingress/LB, reverse proxy — the documented h2c topology), acknowledge with `server.allowInsecure: true`; to enforce https at this bundle, set `server.requireHttps: true`.');
|
|
1567
|
+
}
|
|
1568
|
+
} else if ( _tpRequireHttps === true && serverOpt.scheme === 'https' && !self.isLocalScope() ) {
|
|
1569
|
+
console.info('[ BUNDLE ][ server ][ init ] transport posture: server.requireHttps satisfied — scheme is https.');
|
|
1570
|
+
}
|
|
1571
|
+
|
|
1338
1572
|
self.emit('configured', false, engine.instance, engine.middleware, self.conf[self.appName][self.env]);
|
|
1339
1573
|
|
|
1340
1574
|
} catch (err) {
|
|
@@ -76,6 +76,18 @@
|
|
|
76
76
|
"debounceMs": 750,
|
|
77
77
|
"reconcileIntervalMs": 0
|
|
78
78
|
},
|
|
79
|
+
// #COMPLY9 — production transport posture. Outside the `local` scope a bundle
|
|
80
|
+
// resolving a cleartext scheme (anything but https) WARNS at boot.
|
|
81
|
+
// "requireHttps": true -> refuse to boot the cleartext bundle instead — the
|
|
82
|
+
// refusal is pre-listen, nothing ever binds.
|
|
83
|
+
// "allowInsecure": true -> acknowledge that TLS terminates upstream (mesh
|
|
84
|
+
// sidecar, ingress/LB, reverse proxy — the documented
|
|
85
|
+
// h2c topology); the warn becomes one info line. Same
|
|
86
|
+
// vocabulary as `mcp.json > server > allowInsecure`.
|
|
87
|
+
// Strict booleans; setting both is a boot-refused contradiction. Resolved like
|
|
88
|
+
// `scheme` itself: bundle settings win, env.json's `server` block fills per env.
|
|
89
|
+
// The keys are deliberately NOT set here — an explicit template default would
|
|
90
|
+
// shadow env.json's per-env fill.
|
|
79
91
|
// Compare with core/content.encoding
|
|
80
92
|
// This is the prefered order when it comes to respond with compressed content
|
|
81
93
|
"preferedCompressionEncodingOrder": ["br", "deflate", "gzip", "zstdn", "dcb", "dcz", "compress"]
|
|
@@ -228,8 +240,32 @@
|
|
|
228
240
|
// },
|
|
229
241
|
// "authenticator": null
|
|
230
242
|
// }
|
|
243
|
+
//
|
|
244
|
+
// requireAuthByDefault — #COMPLY10 deny-by-default authorization.
|
|
245
|
+
// false (default) keeps today's posture: a route is open unless it
|
|
246
|
+
// declares `requireAuth` / `roles` / `policy`. true INVERTS that for
|
|
247
|
+
// THIS bundle — every route requires authentication unless its
|
|
248
|
+
// `param` carries `"public": true`. STRICTLY boolean: a truthy
|
|
249
|
+
// string would leave every un-annotated route silently UNGATED while
|
|
250
|
+
// you believed the bundle was locked down, so it refuses to boot.
|
|
251
|
+
// Enable it in a non-production environment FIRST and read the boot
|
|
252
|
+
// line, which reports how many routes it just gated.
|
|
253
|
+
// The boot also refuses three configs this mode makes dangerous:
|
|
254
|
+
// * `"public": true` on a route that ALSO declares an explicit
|
|
255
|
+
// gate key (it cannot be both exempt from auth and gated by it);
|
|
256
|
+
// * a login route the mode would gate — it would bounce to itself,
|
|
257
|
+
// an infinite redirect that locks out every visitor;
|
|
258
|
+
// * a mode-gated route that also declares `cache` — the render
|
|
259
|
+
// cache is read BEFORE authorization and its key carries no user
|
|
260
|
+
// identity, so a cached gated route would replay one user's
|
|
261
|
+
// authenticated page to anonymous callers.
|
|
262
|
+
// The framework's own injected routes ship `"public": true`, so the
|
|
263
|
+
// site root, the error page, `/_status` and the upload endpoints keep
|
|
264
|
+
// working when you flip this on.
|
|
265
|
+
// Changing this needs a bundle restart (boot config).
|
|
231
266
|
"auth": {
|
|
232
267
|
"loginRoute": null,
|
|
268
|
+
"requireAuthByDefault": false,
|
|
233
269
|
"machine": {
|
|
234
270
|
"enabled": false,
|
|
235
271
|
"callers": {},
|
|
@@ -61,6 +61,32 @@
|
|
|
61
61
|
* It is a strict NO-OP for every route that declares no authorization key, so an
|
|
62
62
|
* existing bundle is byte-identical.
|
|
63
63
|
*
|
|
64
|
+
* ## Deny-by-default (#COMPLY10 — opt-in, per bundle)
|
|
65
|
+
* `settings.json > auth.requireAuthByDefault: true` INVERTS that last sentence for
|
|
66
|
+
* the bundle that sets it: a route declaring no authorization key is then GATED
|
|
67
|
+
* rather than open, and a route opts back out with `param.public: true`. Nothing
|
|
68
|
+
* else about the gate changes — an un-annotated route carries neither `roles` nor
|
|
69
|
+
* `policy`, so the mode can only ever produce the 401 or the login bounce.
|
|
70
|
+
*
|
|
71
|
+
* The exemption is a POSITIVE marker (`public: true`), matching #CSRF2's
|
|
72
|
+
* `csrfExempt` rationale: a misread leaves the SECURE state. Reusing
|
|
73
|
+
* `requireAuth: false` was rejected for the opposite reason — it would make one
|
|
74
|
+
* literal mean "no-op" in a normal bundle and "audited security exemption" in a
|
|
75
|
+
* deny-by-default one, so a reviewer could not tell an intentional exemption from
|
|
76
|
+
* a leftover.
|
|
77
|
+
*
|
|
78
|
+
* The mode is keyed PER BUNDLE (`_authConf.byBundle`), not flat: merged mode runs
|
|
79
|
+
* every bundle in one process, and a flat flag would let whichever bundle booted
|
|
80
|
+
* last decide the posture for all of them — silently un-gating a bundle that had
|
|
81
|
+
* opted in. See `requireAuthByDefault()` below.
|
|
82
|
+
*
|
|
83
|
+
* `core/server.js` refuses to boot on the contradictions the mode makes possible:
|
|
84
|
+
* `public` alongside an explicit gate key; a login route the mode would gate (which
|
|
85
|
+
* bounces to itself — an infinite redirect, i.e. total lockout); and a route the
|
|
86
|
+
* mode gates that also declares `cache`, because both render-cache serve points run
|
|
87
|
+
* BEFORE this gate and the cache key carries no principal, so a cached gated route
|
|
88
|
+
* would replay an authenticated body to anonymous callers.
|
|
89
|
+
*
|
|
64
90
|
* ## The roles contract (#COMPLY1 defines it; the app populates it)
|
|
65
91
|
* `req.session.user.roles` is a plain array of opaque role-name strings — the
|
|
66
92
|
* framework imposes no vocabulary and no role→permission indirection (v1 names
|
|
@@ -211,6 +237,57 @@ var getLoginRoute = function () {
|
|
|
211
237
|
return ( conf && typeof(conf.loginRoute) == 'string' && conf.loginRoute ) ? conf.loginRoute : null;
|
|
212
238
|
};
|
|
213
239
|
|
|
240
|
+
/**
|
|
241
|
+
* #COMPLY10 — read the deny-by-default authorization mode for the request's
|
|
242
|
+
* OWN bundle.
|
|
243
|
+
*
|
|
244
|
+
* `core/server.js` lints `settings.json > auth.requireAuthByDefault` at boot and
|
|
245
|
+
* writes it onto `process.gina._authConf.byBundle[<bundle>]`, so the request path
|
|
246
|
+
* costs an O(1) property read (the `loginRoute` / `_policies` precedent).
|
|
247
|
+
*
|
|
248
|
+
* The per-bundle keying is load-bearing rather than tidy. `_authConf` is written
|
|
249
|
+
* once per `init()`, and MERGED mode runs every bundle of a project in ONE process
|
|
250
|
+
* (`core/config.js`), so a flat flag would be overwritten by whichever bundle
|
|
251
|
+
* booted last: a bundle that enabled the mode would silently un-gate every one of
|
|
252
|
+
* its routes because a sibling booted after it without the key. That is a
|
|
253
|
+
* fail-OPEN, and the one failure direction a deny-by-default control must never
|
|
254
|
+
* have. Keying by `req.routing.bundle` — populated on BOTH dispatch paths — makes
|
|
255
|
+
* each bundle's posture independent of its boot order.
|
|
256
|
+
*
|
|
257
|
+
* Fail-safe direction is deliberately INVERTED here relative to the rest of the
|
|
258
|
+
* gate: an unidentifiable bundle returns `false` (do not gate). Every other
|
|
259
|
+
* unknown in this module denies, because denying is the safe direction when the
|
|
260
|
+
* question is "may this caller through". Here the question is "did an operator
|
|
261
|
+
* ask for this mode at all", and answering yes on missing evidence would gate a
|
|
262
|
+
* bundle whose author never opted in — turning a config gap into a total outage.
|
|
263
|
+
* It is unreachable from dispatch regardless (`core/server.js` skips any route
|
|
264
|
+
* carrying no `param`, and every matched route carries a `bundle`).
|
|
265
|
+
*
|
|
266
|
+
* @param {object} req - the request (reads `req.routing.bundle`).
|
|
267
|
+
* @returns {boolean} `true` when THIS bundle opted into deny-by-default.
|
|
268
|
+
* @inner
|
|
269
|
+
* @private
|
|
270
|
+
*/
|
|
271
|
+
var requireAuthByDefault = function (req) {
|
|
272
|
+
var conf = ( typeof(process.gina) != 'undefined' && process.gina && process.gina._authConf )
|
|
273
|
+
? process.gina._authConf
|
|
274
|
+
: null;
|
|
275
|
+
|
|
276
|
+
if ( !conf || !conf.byBundle || typeof(conf.byBundle) != 'object' ) {
|
|
277
|
+
return false;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
var bundle = ( req && req.routing && typeof(req.routing.bundle) == 'string' && req.routing.bundle !== '' )
|
|
281
|
+
? req.routing.bundle
|
|
282
|
+
: null;
|
|
283
|
+
if ( !bundle ) {
|
|
284
|
+
return false;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
var entry = conf.byBundle[bundle];
|
|
288
|
+
return ( entry && entry.requireAuthByDefault === true ) ? true : false;
|
|
289
|
+
};
|
|
290
|
+
|
|
214
291
|
/**
|
|
215
292
|
* The authentication predicate — the shape every #COMPLY1 surface reads.
|
|
216
293
|
*
|
|
@@ -874,11 +951,75 @@ var runPolicy = function (controller, req, name, user) {
|
|
|
874
951
|
return denyForbidden(controller, req, 'policy `'+ name +'` did not allow', '403-policy');
|
|
875
952
|
};
|
|
876
953
|
|
|
954
|
+
/**
|
|
955
|
+
* Is the matched route gated by authorization at all?
|
|
956
|
+
*
|
|
957
|
+
* The ONE runtime answer to that question: `authorizeRequest` branches on it to
|
|
958
|
+
* decide whether to authenticate, and the render delegates read it to decide
|
|
959
|
+
* whether an entry may be written to the render cache (#B158). Keeping a single
|
|
960
|
+
* implementation is the point — a second copy that drifted would either gate a
|
|
961
|
+
* route the cache still stores (the #B158 leak, reopened) or refuse to store a
|
|
962
|
+
* route nobody gates.
|
|
963
|
+
*
|
|
964
|
+
* Precedence is STRUCTURAL, not conditional, and deliberately so: `param.public`
|
|
965
|
+
* is consulted only INSIDE the un-annotated branch, so it can never un-gate a
|
|
966
|
+
* route that carries an explicit key. The boot lint refuses that contradiction
|
|
967
|
+
* outright, but a hand-built or tampered config must still fail CLOSED without
|
|
968
|
+
* depending on the lint having run.
|
|
969
|
+
*
|
|
970
|
+
* @param {object} req - the request. Reads `req.routing.param.requireAuth`,
|
|
971
|
+
* `param.roles`, `param.policy`, `param.public` and
|
|
972
|
+
* `req.routing.bundle` (for the #COMPLY10 per-bundle mode).
|
|
973
|
+
* @returns {boolean} `true` when the route requires an authenticated principal.
|
|
974
|
+
*
|
|
975
|
+
* @example
|
|
976
|
+
* // a render delegate, before storing a rendered body
|
|
977
|
+
* if ( lib.authzGate.isRouteGated(req) ) {
|
|
978
|
+
* return; // never cache a body rendered for an authenticated principal
|
|
979
|
+
* }
|
|
980
|
+
*/
|
|
981
|
+
var isRouteGated = function (req) {
|
|
982
|
+
if ( !req || !req.routing || !req.routing.param ) {
|
|
983
|
+
return false;
|
|
984
|
+
}
|
|
985
|
+
|
|
986
|
+
var param = req.routing.param;
|
|
987
|
+
|
|
988
|
+
// An explicit key gates the route. `roles` and `policy` each IMPLY
|
|
989
|
+
// `requireAuth` — an unauthenticated caller can hold no role, and a policy
|
|
990
|
+
// is handed an authenticated user. Strict shapes only: the boot lint rejects
|
|
991
|
+
// every other declared form, so an invalid key must never HALF-gate.
|
|
992
|
+
if ( param.requireAuth === true ) {
|
|
993
|
+
return true;
|
|
994
|
+
}
|
|
995
|
+
if ( Array.isArray(param.roles) && param.roles.length > 0 ) {
|
|
996
|
+
return true;
|
|
997
|
+
}
|
|
998
|
+
if ( typeof(param.policy) == 'string' && param.policy !== '' ) {
|
|
999
|
+
return true;
|
|
1000
|
+
}
|
|
1001
|
+
|
|
1002
|
+
// Un-annotated from here — the only branch #COMPLY10 inverts. Written as a
|
|
1003
|
+
// `!== true` test on purpose: §15.2 locates `authorizeRequest`'s own strict
|
|
1004
|
+
// equality test on `param.public` by taking the FIRST match of that source
|
|
1005
|
+
// line in this file, to prove the exemption sits inside its un-annotated
|
|
1006
|
+
// branch. Spelling the same form here — in code OR in a comment quoting it —
|
|
1007
|
+
// steals that position and breaks the pin without changing any behaviour,
|
|
1008
|
+
// so do not "tidy" this into the strict-equality form.
|
|
1009
|
+
if ( param.public !== true ) {
|
|
1010
|
+
return requireAuthByDefault(req);
|
|
1011
|
+
}
|
|
1012
|
+
|
|
1013
|
+
return false; // explicitly exempted from the default gate
|
|
1014
|
+
};
|
|
1015
|
+
|
|
877
1016
|
/**
|
|
878
1017
|
* Authorize a request against the route it matched.
|
|
879
1018
|
*
|
|
880
1019
|
* NO-OP (returns `true`) unless the route declares an authorization key
|
|
881
|
-
* (`param.requireAuth: true`, `param.roles` and/or `param.policy`)
|
|
1020
|
+
* (`param.requireAuth: true`, `param.roles` and/or `param.policy`) — or unless the
|
|
1021
|
+
* bundle opted into #COMPLY10 deny-by-default, in which case an un-annotated route
|
|
1022
|
+
* is gated too, and only `param.public: true` exempts it. Evaluation order:
|
|
882
1023
|
* **authN → roles → policy** — an unauthenticated caller on a gated route always gets
|
|
883
1024
|
* the 401/bounce, never a 403 (it must not learn that the route is role- or
|
|
884
1025
|
* policy-restricted, only that it requires signing in). Roles and policy are
|
|
@@ -894,6 +1035,8 @@ var runPolicy = function (controller, req, name, user) {
|
|
|
894
1035
|
* write the response).
|
|
895
1036
|
* @param {object} req - the request. Reads `req.routing.param.requireAuth`,
|
|
896
1037
|
* `req.routing.param.roles`, `req.routing.param.policy`,
|
|
1038
|
+
* `req.routing.param.public` and `req.routing.bundle`
|
|
1039
|
+
* (#COMPLY10),
|
|
897
1040
|
* `req.session.user` (and its `.roles`),
|
|
898
1041
|
* `req.headers.authorization` (#MS3, gated routes only),
|
|
899
1042
|
* `req.isXMLRequest` and `req[method]`; stamps
|
|
@@ -931,8 +1074,31 @@ var authorizeRequest = function (controller, req, res) {
|
|
|
931
1074
|
|
|
932
1075
|
// Strictly `=== true`: the boot lint rejects any other type, so by request time the
|
|
933
1076
|
// flag is `true`, `false` or absent — and an absent/false flag must never gate.
|
|
1077
|
+
//
|
|
1078
|
+
// `isRouteGated` above answers the same question for callers that need the verdict
|
|
1079
|
+
// without the enforcement (the #B158 render-cache write guard). The two MUST move
|
|
1080
|
+
// together; §15 pins this structure and a truth-table test pins their agreement.
|
|
934
1081
|
if ( param.requireAuth !== true && !mustMatchRoles && !mustRunPolicy ) {
|
|
935
|
-
|
|
1082
|
+
// #COMPLY10 — the deny-by-default mode inverts THIS branch, and only this
|
|
1083
|
+
// branch: an un-annotated route becomes gated instead of open.
|
|
1084
|
+
//
|
|
1085
|
+
// `param.public` is tested INSIDE the un-annotated branch rather than
|
|
1086
|
+
// beside it, which is what makes the precedence STRUCTURAL rather than
|
|
1087
|
+
// conditional: a route carrying `public` alongside an explicit gate key
|
|
1088
|
+
// never reaches here at all, so `public` can never un-gate an explicitly
|
|
1089
|
+
// gated route. The boot lint refuses that contradiction outright — this
|
|
1090
|
+
// shape means a hand-built or tampered config still fails CLOSED instead
|
|
1091
|
+
// of depending on the lint having run.
|
|
1092
|
+
if ( param.public === true ) {
|
|
1093
|
+
return true; // explicitly exempted from the default gate
|
|
1094
|
+
}
|
|
1095
|
+
if ( !requireAuthByDefault(req) ) {
|
|
1096
|
+
return true; // mode off — the pre-#COMPLY10 no-op, byte-identical
|
|
1097
|
+
}
|
|
1098
|
+
// Mode ON, un-annotated, not exempt: fall through to the authN block below.
|
|
1099
|
+
// `roles` and `policy` are absent by definition on this path, so the only
|
|
1100
|
+
// reachable outcomes are the 401 and the login bounce — a 403 cannot occur
|
|
1101
|
+
// here, which preserves the shipped 401-vs-403 convention with no new code.
|
|
936
1102
|
}
|
|
937
1103
|
|
|
938
1104
|
// The effective principal: the SESSION user when authenticated (session
|
|
@@ -989,6 +1155,7 @@ var authorizeRequest = function (controller, req, res) {
|
|
|
989
1155
|
|
|
990
1156
|
module.exports = {
|
|
991
1157
|
authorizeRequest : authorizeRequest,
|
|
1158
|
+
isRouteGated : isRouteGated,
|
|
992
1159
|
isAuthenticated : isAuthenticated,
|
|
993
1160
|
hasAnyRole : hasAnyRole,
|
|
994
1161
|
registerPolicy : registerPolicy,
|
|
@@ -295,9 +295,22 @@
|
|
|
295
295
|
allowlist (`http(s)://localhost`, `127.0.0.1`,
|
|
296
296
|
`[::1]` on any port). Comma-separated. Pass
|
|
297
297
|
`*` to disable the Origin check entirely.
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
298
|
+
--allow-insecure Run without a bearer token even when an
|
|
299
|
+
ambient protection has been removed. Assert
|
|
300
|
+
only when access is restricted upstream (mesh,
|
|
301
|
+
NetworkPolicy, authenticating proxy). Also
|
|
302
|
+
`mcp.json > server > allowInsecure`.
|
|
303
|
+
|
|
304
|
+
Default security posture — bind loopback, Origin allowlist accepts
|
|
305
|
+
localhost / 127.0.0.1 / [::1] only. On that default a bearer token is
|
|
306
|
+
optional: the loopback bind and the Origin allowlist are the protection.
|
|
307
|
+
|
|
308
|
+
Remove either one and a token becomes REQUIRED — binding a non-loopback
|
|
309
|
+
address (`--http-host=0.0.0.0`), or disabling the Origin check
|
|
310
|
+
(`--cors-origin=*`), makes the server refuse to start unless you pass
|
|
311
|
+
`--auth-token` or `--allow-insecure`. Nothing ever listens unauthenticated.
|
|
312
|
+
|
|
313
|
+
For OAuth-protected deployments, place gina behind a reverse proxy
|
|
314
|
+
(oauth2-proxy, Traefik ForwardAuth, nginx `auth_request`) that handles the
|
|
315
|
+
OAuth dance and forwards the upstream request — that topology is
|
|
316
|
+
non-loopback and token-less by design, so it wants `--allow-insecure`.
|