gina 0.6.22 → 0.6.23
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 +12 -0
- package/README.md +18 -16
- package/ROADMAP.md +13 -0
- package/framework/v0.6.23/VERSION +1 -0
- package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/js/gina.js +22 -5
- package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/js/gina.min.js +249 -249
- package/framework/v0.6.23/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- package/framework/v0.6.23/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
- package/framework/{v0.6.22 → v0.6.23}/core/controller/controller.js +38 -8
- package/framework/{v0.6.22 → v0.6.23}/core/controller/controller.render-nunjucks.js +6 -5
- package/framework/{v0.6.22 → v0.6.23}/core/controller/controller.render-swig.js +10 -6
- package/framework/v0.6.23/core/controller/inline-script.js +108 -0
- package/framework/{v0.6.22 → v0.6.23}/core/server.isaac.js +13 -0
- package/framework/{v0.6.22 → v0.6.23}/core/server.js +129 -1
- package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle/config/templates.json +3 -0
- package/framework/{v0.6.22 → v0.6.23}/core/template/conf/settings.json +63 -2
- package/framework/{v0.6.22 → v0.6.23}/core/template/conf/templates.json +1 -0
- package/framework/{v0.6.22 → v0.6.23}/lib/index.js +17 -0
- package/framework/{v0.6.22 → v0.6.23}/lib/merge/src/main.js +22 -5
- package/framework/v0.6.23/lib/security-headers-emitter/package.json +18 -0
- package/framework/v0.6.23/lib/security-headers-emitter/src/main.js +225 -0
- package/framework/v0.6.23/lib/sri/package.json +18 -0
- package/framework/v0.6.23/lib/sri/src/main.js +237 -0
- package/framework/{v0.6.22 → v0.6.23}/package.json +1 -1
- package/gna.js +4 -4
- package/llms.txt +2 -1
- package/package.json +3 -3
- package/schema/settings.json +47 -0
- package/types/index.d.ts +16 -0
- package/framework/v0.6.22/VERSION +0 -1
- package/framework/v0.6.22/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- package/framework/v0.6.22/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/AUTHORS +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/LICENSE +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/asset/html/nolayout.html +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/asset/html/static.html +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/asset/img/android-chrome-192x192.png +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/asset/img/android-chrome-512x512.png +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/asset/img/apple-touch-icon.png +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/asset/img/favicon-16x16.png +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/asset/img/favicon-32x32.png +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/asset/img/favicon.ico +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/config.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/ai/index.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/ai/lib/connector.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/couchbase/index.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/couchbase/lib/connector.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/couchbase/lib/connector.v3.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/couchbase/lib/connector.v4.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/couchbase/lib/n1ql.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/couchbase/lib/session-store.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/couchbase/lib/session-store.v4.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/couchbase/lib/storage-store.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/duckdb/index.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/duckdb/lib/connector.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/mongodb/index.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/mongodb/lib/connector.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/mongodb/lib/job-store.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/mongodb/lib/pipeline-loader.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/mongodb/lib/session-store.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/mysql/index.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/mysql/lib/connector.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/param-redact.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/postgresql/index.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/postgresql/lib/connector.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/redis/index.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/redis/lib/connector.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/redis/lib/job-store.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/redis/lib/kv-store.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/redis/lib/render-cache-store.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/redis/lib/session-store.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/scylladb/index.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/scylladb/lib/connector.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/scylladb/lib/session-store.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/settle-once.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/sql-parser.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/sqlite/index.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/sqlite/lib/connector.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/sqlite/lib/job-store.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/sqlite/lib/kv-store.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/connectors/sqlite/lib/session-store.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/content.encoding +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/controller/controller.framework.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/controller/controller.render-json.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/controller/controller.render-nunjucks-async.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/controller/controller.render-stream.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/controller/controller.render-swig-async.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/controller/controller.render-v1.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/controller/index.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/controller/inspector-window-emit.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/controller/release-banner.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/dev/index.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/dev/lib/class.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/dev/lib/factory.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/dev/lib/tools.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/gna.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/locales/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/locales/currency.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/locales/dist/language/en.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/locales/dist/language/fr.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/locales/dist/region/en.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/locales/dist/region/fr.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/locales/index.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/mime.types +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/model/entity.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/model/index.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/model/template/entityFactory.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/model/template/index.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/index.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/csrf/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/csrf/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/csrf/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/coep/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/coep/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/coep/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/coop/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/coop/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/coop/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/corp/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/corp/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/corp/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/csp/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/csp/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/csp/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/hide-powered-by/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/hide-powered-by/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/hide-powered-by/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/hsts/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/hsts/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/hsts/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/origin-agent-cluster/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/origin-agent-cluster/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/origin-agent-cluster/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/referrer-policy/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/referrer-policy/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/referrer-policy/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-content-type-options/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-content-type-options/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-content-type-options/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-dns-prefetch-control/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-dns-prefetch-control/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-dns-prefetch-control/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-download-options/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-download-options/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-download-options/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-frame-options/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-frame-options/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-frame-options/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-xss-protection/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-xss-protection/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-xss-protection/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/session/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/session/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/session/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/storage/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/storage/build.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/storage/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/storage/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/validator/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/validator/build.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/validator/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/validator/src/form-validator.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/validator/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/router.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/server.express.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/status.codes +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/_gitignore +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle/config/app.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle/config/connectors.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle/config/routing.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle/config/settings.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle/config/watchers.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle/index.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle/locales/en.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle_public/css/default.css +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle_public/css/home.css +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle_public/js/components/x-checklist.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle_public/manifest.webmanifest +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle_public/readme.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle_public/sw.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle_templates/html/includes/x-checklist.html +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/command/gina.bat.tpl +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/command/gina.tpl +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/conf/env.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/conf/manifest.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/conf/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/conf/statics.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/error/client/json/401.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/error/client/json/403.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/error/client/json/404.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/error/server/html/50x.html +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/error/server/json/500.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/error/server/json/503.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/core/template/extensions/logger/config.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/helpers/console.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/helpers/context.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/helpers/data/LICENSE +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/helpers/data/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/helpers/data/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/helpers/data/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/helpers/dateFormat.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/helpers/index.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/helpers/json/LICENSE +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/helpers/json/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/helpers/json/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/helpers/json/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/helpers/path.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/helpers/plugins/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/helpers/plugins/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/helpers/plugins/src/api-error.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/helpers/plugins/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/helpers/prototypes.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/helpers/task.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/helpers/text.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/admin/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/admin/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/archiver/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/archiver/build.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/archiver/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/archiver/src/dep/jszip.min.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/archiver/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/async/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/async/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/audit/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/audit/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/audit-store.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/authn/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/authn/src/lockout.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/authn/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/authn/src/totp.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/authz-gate/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/authz-gate/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cache/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cache/build.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cache/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cache/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/aliases.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/audit/arguments.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/audit/help.txt +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/audit/verify.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/add.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/arguments.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/build.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/copy.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/cp.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/help.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/help.txt +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/inc/name-rewrite.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/list.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/man.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/mcp-start.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/mcp.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/oas.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/openapi.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/remove.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/rename.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/restart.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/rm.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/start.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/status.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/stop.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/types.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/cache/arguments.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/cache/clear.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/cache/help.txt +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/cache/stats.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/connector/add.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/connector/arguments.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/connector/help.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/connector/help.txt +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/connector/infer.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/connector/list.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/connector/migrate.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/connector/models.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/connector/remove.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/connector/rm.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/connector/test.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/container/arguments.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/container/help.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/container/help.txt +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/container/man.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/container/ps.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/container/stop.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/controller/add.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/controller/arguments.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/controller/help.txt +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/controller/inc/args.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/controller/inc/namespace.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/controller/inc/reference-rewrite.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/controller/inc/reference-scan.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/controller/inc/scaffold.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/controller/remove.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/controller/rename.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/controller/rm.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/env/add.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/env/get.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/env/help.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/env/help.txt +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/env/link-dev.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/env/list.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/env/remove.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/env/rm.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/env/set.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/env/unset.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/env/use.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/add.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/arguments.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/build.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/dot.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/get.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/help.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/help.txt +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/init.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/link-node-modules.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/link.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/list.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/man.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/msg.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/open.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/remove.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/reset.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/restart.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/set.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/start.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/status.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/stop.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/tail.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/update.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/version.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/gina-dev.1.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/gina-framework.1.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/gina.1.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/helper.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/i18n/add.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/i18n/arguments.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/i18n/export.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/i18n/help.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/i18n/help.txt +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/i18n/import.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/i18n/scan.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/image/_host.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/image/arguments.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/image/build.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/image/help.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/image/help.txt +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/image/list.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/image/man.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/image/rm.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/image/run.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/index.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/inspector/help.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/inspector/help.txt +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/inspector/open.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/man-render.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/minion/arguments.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/minion/help.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/minion/help.txt +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/minion/kill.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/minion/list.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/msg.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/port/help.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/port/help.txt +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/port/inc/scan.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/port/list.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/port/reset.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/port/set.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/add.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/arguments.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/backup.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/build.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/help.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/help.txt +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/import.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/list.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/man.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/move.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/remove.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/rename.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/restart.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/restore.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/rm.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/start.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/status.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/stop.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/protocol/arguments.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/protocol/help.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/protocol/help.txt +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/protocol/list.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/protocol/remove.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/protocol/set.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/scope/add.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/scope/help.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/scope/help.txt +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/scope/link-local.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/scope/link-production.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/scope/list.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/scope/remove.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/scope/rm.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/scope/use.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/secrets/arguments.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/secrets/check.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/secrets/help.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/secrets/help.txt +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/secrets/scan.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/service/help.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/service/help.txt +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/service/list.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/service/man.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/service/start.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/storage/arguments.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/storage/gc.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/storage/help.txt +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/storage/stats.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/storage/verify.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/view/add.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd-status-format/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cmd-status-format/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/collection/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/collection/build.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/collection/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/collection/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/config.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/connector-config/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/connector-config/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/connector-error/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/connector-error/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/connector-registry/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/connector-registry/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cron/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cron/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/cron/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/domain/LICENSE +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/domain/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/domain/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/domain/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/dto/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/dto/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/dto-pipe/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/dto-pipe/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/dto-types/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/dto-types/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/generator/index.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/i18n/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/i18n/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/image-build/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/image-build/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/inherits/LICENSE +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/inherits/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/inherits/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/inherits/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/inspector-events/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/inspector-events/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/inspector-redact/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/inspector-redact/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/instrument/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/instrument/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/job/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/job/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/job-store.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/json-config-header/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/json-config-header/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/kv/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/kv/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/kv-store.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/loading-state/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/loading-state/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/logger/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/logger/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/logger/src/containers/default/index.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/logger/src/containers/file/index.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/logger/src/containers/mq/index.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/logger/src/containers/mq/listener.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/logger/src/containers/mq/speaker.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/logger/src/helper.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/logger/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/logger/src/redact.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/maintenance/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/maintenance/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/math/index.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/mcp-dispatch/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/mcp-dispatch/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/mcp-http/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/mcp-http/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/mcp-server/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/mcp-server/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/merge/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/merge/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/metrics/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/metrics/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/model.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/net-locality/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/net-locality/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/nunjucks-filters/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/nunjucks-filters/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/nunjucks-filters/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/nunjucks-resolver/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/nunjucks-resolver/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/proc.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/push/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/push/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/rate-limit/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/rate-limit/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/release-watch/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/release-watch/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/render-cache/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/render-cache/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/render-cache-store.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/routing/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/routing/build.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/routing/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/routing/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/routing/src/radix.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/routing-introspect/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/routing-introspect/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/secrets/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/secrets/src/backends/env.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/secrets/src/backends/exec.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/secrets/src/backends/file.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/secrets/src/declaration.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/secrets/src/env-file.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/secrets/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/secrets/src/sources.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/session-store.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/shell.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/sqlite-driver.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/state.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/storage/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/storage/src/local-cas.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/storage/src/local-stream.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/storage/src/local.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/storage/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/storage/src/meta-store.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/storage/src/s3.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/storage/src/util.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/storage-store.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/swig-filters/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/swig-filters/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/swig-filters/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/swig-resolver/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/swig-resolver/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/template-loaders/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/template-loaders/src/loaders/http.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/template-loaders/src/loaders/memory.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/template-loaders/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/url/README.md +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/url/index.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/url/routing.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/uuid/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/uuid/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/validator.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/watcher/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/watcher/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/ws-framing/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/ws-framing/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/ws-query/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/ws-query/src/main.js +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/ws-session/package.json +0 -0
- /package/framework/{v0.6.22 → v0.6.23}/lib/ws-session/src/main.js +0 -0
|
@@ -41,9 +41,12 @@ function Merge() {
|
|
|
41
41
|
*
|
|
42
42
|
* Key rejection is the WHOLE guard, deliberately. The first cut of #B446 also
|
|
43
43
|
* skipped inherited enumerable source properties, which broke every entity in
|
|
44
|
-
* the model registry:
|
|
45
|
-
*
|
|
46
|
-
*
|
|
44
|
+
* the model registry: the model layer round-trips entity instances through
|
|
45
|
+
* merge — the in-tree path is the relations assembly (core/model/entity.js),
|
|
46
|
+
* and the registry's setModel (lib/model.js), while it has no in-tree caller,
|
|
47
|
+
* is published through the modelUtil context and stays consumer-reachable —
|
|
48
|
+
* and all six SQL connectors attach their .sql-derived query methods to the
|
|
49
|
+
* PROTOTYPE, so an own-only copy silently dropped them
|
|
47
50
|
* (`db.xEntity.getOneById is not a function`). merge therefore copies the
|
|
48
51
|
* chain, as it always has; only these three key names are refused.
|
|
49
52
|
*
|
|
@@ -684,8 +687,22 @@ function Merge() {
|
|
|
684
687
|
|
|
685
688
|
var hasOwn = {}.hasOwnProperty;
|
|
686
689
|
var hasOwnConstructor = hasOwn.call(obj, 'constructor');
|
|
687
|
-
//
|
|
688
|
-
|
|
690
|
+
// #B450 — compute lazily, restoring the original short-circuit. An OWN
|
|
691
|
+
// `constructor` key (the shape JSON.parse yields for
|
|
692
|
+
// `{"constructor": <primitive|null|{}|[]>}`) shadows
|
|
693
|
+
// Object.prototype.constructor, so the eager read
|
|
694
|
+
// `obj.constructor.prototype` was undefined (or threw outright for null)
|
|
695
|
+
// and `hasOwn.call(undefined, ...)` crashed the whole merge —
|
|
696
|
+
// request-reachable, since PUT bodies reach merge as the source. When the
|
|
697
|
+
// object HAS an own constructor the rejection branch below cannot fire,
|
|
698
|
+
// so the value is never needed; when it lacks one, guard the `.prototype`
|
|
699
|
+
// read. A 24-shape differential sweep pins identical answers on every
|
|
700
|
+
// input the old form did not crash on (test/lib/merge-b450.test.js).
|
|
701
|
+
// was: var hasMethodPrototyped = ( typeof(obj.constructor) != 'undefined' ) ? hasOwn.call(obj.constructor.prototype, 'isPrototypeOf') : false;
|
|
702
|
+
var hasMethodPrototyped = false;
|
|
703
|
+
if ( !hasOwnConstructor && typeof(obj.constructor) != 'undefined' ) {
|
|
704
|
+
hasMethodPrototyped = ( obj.constructor.prototype ) ? hasOwn.call(obj.constructor.prototype, 'isPrototypeOf') : false;
|
|
705
|
+
}
|
|
689
706
|
|
|
690
707
|
|
|
691
708
|
if (
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "gina-lib-security-headers-emitter",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Engine-agnostic security-header emission (#OW1)",
|
|
5
|
+
"authors": [
|
|
6
|
+
{
|
|
7
|
+
"name": "Martin Luther ETOUMAN NDAMBWE",
|
|
8
|
+
"email": "contact@gina.io"
|
|
9
|
+
}
|
|
10
|
+
],
|
|
11
|
+
"copyright": "Copyright (c) 2009-2026 Rhinostone <contact@gina.io>",
|
|
12
|
+
"engines": {
|
|
13
|
+
"node": ">=0.10.22"
|
|
14
|
+
},
|
|
15
|
+
"main": "src/main",
|
|
16
|
+
"license": "MIT",
|
|
17
|
+
"readmeFilename": "README.md"
|
|
18
|
+
}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
/**
|
|
3
|
+
* @module lib/security-headers-emitter
|
|
4
|
+
* @description #OW1 — engine-agnostic security-header emission (OWASP A02).
|
|
5
|
+
*
|
|
6
|
+
* WHY THIS EXISTS AT THE FRAMEWORK LAYER, not as a mounted middleware.
|
|
7
|
+
* The `#HDR1-14` plugins are express middleware, and gina's DEFAULT engine is
|
|
8
|
+
* `isaac`, which never runs the express middleware chain for HTTP responses:
|
|
9
|
+
* `server.use()` stores functions in `server._expressMiddlewares`, and the ONLY
|
|
10
|
+
* consumer is the WebSocket session binder, which name-filters the chain down to
|
|
11
|
+
* `session` / `ginaSessionAbsoluteTimeout` and runs it against an inert response
|
|
12
|
+
* whose header methods are all no-ops (measured 2026-09-02). So scaffolding
|
|
13
|
+
* `app.use(gina.plugins.SecurityHeaders())` would emit ZERO headers on the
|
|
14
|
+
* default engine — security theatre. This module is the same shape as the
|
|
15
|
+
* `#HDR8` hidePoweredBy gate, which was built framework-side for exactly this
|
|
16
|
+
* reason and is the established precedent.
|
|
17
|
+
*
|
|
18
|
+
* THE DEFAULT SET IS NARROWER THAN THE ORCHESTRATOR'S "SAFE SET", DELIBERATELY.
|
|
19
|
+
* The orchestrator's 12-plugin safe set is safe to MOUNT deliberately; it is not
|
|
20
|
+
* all safe to DEFAULT ON for every existing bundle. Four are opt-in here, each
|
|
21
|
+
* with a named breakage rather than a guess:
|
|
22
|
+
* - `corp` — MEASURED conflict: gina's own `/_gina/*` endpoints emit
|
|
23
|
+
* `access-control-allow-origin: *` (metrics, health, SSE; the
|
|
24
|
+
* Inspector's cross-origin GET/SSE channels are a documented
|
|
25
|
+
* design), and CORP blocks cross-origin LOADING regardless of
|
|
26
|
+
* CORS. See the `/_gina/*` exemption below.
|
|
27
|
+
* - `hsts` — emits regardless of transport (documented spec deviation), so
|
|
28
|
+
* enabling it commits every https consumer's browsers to 180 days
|
|
29
|
+
* without them asking.
|
|
30
|
+
* - `coop` — severs `window.opener`; breaks OAuth/payment popup flows.
|
|
31
|
+
* - `xFrameOptions` — breaks a consumer who deliberately embeds their app
|
|
32
|
+
* cross-origin. (gina itself uses no iframes — measured — so the
|
|
33
|
+
* risk is consumer-facing only; this is the weakest of the four
|
|
34
|
+
* and the cheapest to enable.)
|
|
35
|
+
*
|
|
36
|
+
* PRECEDENCE: first-writer-wins. Any header already present on the response is
|
|
37
|
+
* left alone, so an explicitly mounted plugin, an `env.json`
|
|
38
|
+
* `server.response.header` entry, or an upstream proxy always beats the
|
|
39
|
+
* framework default. This mirrors the plugins' own idempotent contract.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* // core/server.js (engine-agnostic, setHeader-based)
|
|
43
|
+
* var secHeaders = require('lib/security-headers-emitter');
|
|
44
|
+
* secHeaders.applyToResponse(conf.server.securityHeaders, request, response);
|
|
45
|
+
*
|
|
46
|
+
* // core/server.isaac.js (writeHead-based, header OBJECT)
|
|
47
|
+
* headers = secHeaders.applyToHeaders(options.securityHeaders, request, headers);
|
|
48
|
+
*/
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* The framework-emittable header set, with the values read from each `#HDR`
|
|
52
|
+
* plugin's own `HEADER_VALUE` / `DEFAULT_VALUE` (measured, never invented) so
|
|
53
|
+
* the framework default and the mounted plugin agree byte-for-byte.
|
|
54
|
+
*
|
|
55
|
+
* `onByDefault: false` entries are Tier B — available, opt-in per the rationale
|
|
56
|
+
* in the module docblock.
|
|
57
|
+
*
|
|
58
|
+
* @constant
|
|
59
|
+
* @type {Array<{key: string, header: string, value: string, onByDefault: boolean, ginaExempt: boolean}>}
|
|
60
|
+
* @private
|
|
61
|
+
*/
|
|
62
|
+
var HEADERS = [
|
|
63
|
+
// ── Tier A — on by default: cannot break a working application ──────────
|
|
64
|
+
{ key: 'xContentTypeOptions', header: 'x-content-type-options', value: 'nosniff', onByDefault: true, ginaExempt: false },
|
|
65
|
+
{ key: 'xDownloadOptions', header: 'x-download-options', value: 'noopen', onByDefault: true, ginaExempt: false },
|
|
66
|
+
{ key: 'xPermittedCrossDomainPolicies',header: 'x-permitted-cross-domain-policies', value: 'none', onByDefault: true, ginaExempt: false },
|
|
67
|
+
{ key: 'xXssProtection', header: 'x-xss-protection', value: '0', onByDefault: true, ginaExempt: false },
|
|
68
|
+
{ key: 'referrerPolicy', header: 'referrer-policy', value: 'strict-origin-when-cross-origin', onByDefault: true, ginaExempt: false },
|
|
69
|
+
{ key: 'xDnsPrefetchControl', header: 'x-dns-prefetch-control', value: 'off', onByDefault: true, ginaExempt: false },
|
|
70
|
+
{ key: 'originAgentCluster', header: 'origin-agent-cluster', value: '?1', onByDefault: true, ginaExempt: false },
|
|
71
|
+
|
|
72
|
+
// ── Tier B — opt-in: each can break a legitimate deployment ─────────────
|
|
73
|
+
{ key: 'xFrameOptions', header: 'x-frame-options', value: 'SAMEORIGIN', onByDefault: false, ginaExempt: false },
|
|
74
|
+
// hsts value = the Hsts plugin's own default composition (max-age only —
|
|
75
|
+
// DEFAULT_MAX_AGE, no includeSubDomains/preload, which stay plugin/proxy
|
|
76
|
+
// territory; first-writer-wins defers to either). Parity is asserted in
|
|
77
|
+
// the tests against the plugin's exported builder, never retyped.
|
|
78
|
+
{ key: 'hsts', header: 'strict-transport-security', value: 'max-age=15552000', onByDefault: false, ginaExempt: false },
|
|
79
|
+
{ key: 'coop', header: 'cross-origin-opener-policy', value: 'same-origin', onByDefault: false, ginaExempt: true },
|
|
80
|
+
// ginaExempt — see applyTo*: never applied to /_gina/*, which is
|
|
81
|
+
// deliberately cross-origin.
|
|
82
|
+
{ key: 'corp', header: 'cross-origin-resource-policy', value: 'same-origin', onByDefault: false, ginaExempt: true }
|
|
83
|
+
];
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* `/_gina/*` is the framework's own control/observability surface and is
|
|
87
|
+
* DELIBERATELY cross-origin (`access-control-allow-origin: *` at the metrics,
|
|
88
|
+
* health and SSE endpoints; the Inspector's cross-origin GET/SSE channels are a
|
|
89
|
+
* documented design). A cross-origin-isolating header applied there would break
|
|
90
|
+
* gina's own endpoints even for a consumer who opted in knowingly — so the
|
|
91
|
+
* `ginaExempt` entries are skipped on that prefix regardless of configuration.
|
|
92
|
+
*
|
|
93
|
+
* @constant
|
|
94
|
+
* @type {RegExp}
|
|
95
|
+
* @private
|
|
96
|
+
*/
|
|
97
|
+
var GINA_PREFIX = /^\/_gina\//;
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Decide whether a given entry should be emitted for this request.
|
|
101
|
+
*
|
|
102
|
+
* @param {object} entry - a HEADERS row
|
|
103
|
+
* @param {object} cfg - the resolved `server.securityHeaders` config
|
|
104
|
+
* @param {string} url - `request.url` (may be undefined)
|
|
105
|
+
* @returns {boolean} true when the header should be written
|
|
106
|
+
* @private
|
|
107
|
+
*/
|
|
108
|
+
var shouldEmit = function(entry, cfg, url) {
|
|
109
|
+
var setting = cfg[entry.key];
|
|
110
|
+
var on = ( typeof(setting) == 'undefined' ) ? entry.onByDefault : (setting === true);
|
|
111
|
+
if ( !on ) { return false }
|
|
112
|
+
if ( entry.ginaExempt && typeof(url) == 'string' && GINA_PREFIX.test(url) ) { return false }
|
|
113
|
+
return true
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Normalise the config block. Absent / non-object ⇒ defaults; `enabled: false`
|
|
118
|
+
* ⇒ the whole emitter is off (one key to restore pre-0.6.23 behaviour).
|
|
119
|
+
*
|
|
120
|
+
* @param {object|undefined} raw - `settings.json > server.securityHeaders`
|
|
121
|
+
* @returns {object|null} the config, or null when disabled entirely
|
|
122
|
+
* @private
|
|
123
|
+
*/
|
|
124
|
+
var resolveConfig = function(raw) {
|
|
125
|
+
var cfg = ( raw && typeof(raw) == 'object' ) ? raw : {};
|
|
126
|
+
if ( cfg.enabled === false ) { return null }
|
|
127
|
+
return cfg
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Apply to a `setHeader`-based response (the engine-agnostic `core/server.js`
|
|
132
|
+
* path — routed responses, static serves, framework error pages, both engines).
|
|
133
|
+
*
|
|
134
|
+
* First-writer-wins: an already-present header is never overwritten.
|
|
135
|
+
*
|
|
136
|
+
* @param {object|undefined} raw - `server.securityHeaders` config
|
|
137
|
+
* @param {object} request - the incoming request (read for `.url`)
|
|
138
|
+
* @param {object} response - the outgoing response
|
|
139
|
+
* @returns {void}
|
|
140
|
+
* @example
|
|
141
|
+
* applyToResponse(conf.server.securityHeaders, request, response);
|
|
142
|
+
*/
|
|
143
|
+
var applyToResponse = function(raw, request, response) {
|
|
144
|
+
var cfg = resolveConfig(raw);
|
|
145
|
+
if ( !cfg || !response || typeof(response.setHeader) != 'function' ) { return }
|
|
146
|
+
if ( response.headersSent ) { return }
|
|
147
|
+
|
|
148
|
+
var url = ( request && typeof(request.url) == 'string' ) ? request.url : undefined;
|
|
149
|
+
|
|
150
|
+
for (var i = 0, len = HEADERS.length; i < len; ++i) {
|
|
151
|
+
var entry = HEADERS[i];
|
|
152
|
+
if ( !shouldEmit(entry, cfg, url) ) { continue }
|
|
153
|
+
// first-writer-wins — a mounted plugin, an env.json
|
|
154
|
+
// `server.response.header` entry or an upstream proxy always wins.
|
|
155
|
+
if ( typeof(response.getHeader) == 'function' && response.getHeader(entry.header) ) { continue }
|
|
156
|
+
response.setHeader(entry.header, entry.value);
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Apply to a plain header OBJECT (the isaac `writeHead` path — 31 emit sites
|
|
162
|
+
* funnel through `_setPoweredByHeader`, which `writeHead` commits directly,
|
|
163
|
+
* bypassing `setHeader` entirely).
|
|
164
|
+
*
|
|
165
|
+
* @param {object|undefined} raw - `server.securityHeaders` config
|
|
166
|
+
* @param {object} request - the incoming request (read for `.url`)
|
|
167
|
+
* @param {object} headers - the header map about to be written
|
|
168
|
+
* @returns {object} the same map, mutated and returned for chaining
|
|
169
|
+
* @example
|
|
170
|
+
* headers = applyToHeaders(options.securityHeaders, request, headers);
|
|
171
|
+
*/
|
|
172
|
+
var applyToHeaders = function(raw, request, headers) {
|
|
173
|
+
var cfg = resolveConfig(raw);
|
|
174
|
+
if ( !cfg || !headers || typeof(headers) != 'object' ) { return headers }
|
|
175
|
+
|
|
176
|
+
var url = ( request && typeof(request.url) == 'string' ) ? request.url : undefined;
|
|
177
|
+
|
|
178
|
+
// Header maps here are written by hand at each writeHead site with mixed
|
|
179
|
+
// casing, so the present-check is case-insensitive — a same-header-different-
|
|
180
|
+
// case entry must still win, or the response carries it twice.
|
|
181
|
+
var present = {};
|
|
182
|
+
for (var k in headers) {
|
|
183
|
+
if ( Object.prototype.hasOwnProperty.call(headers, k) ) { present[String(k).toLowerCase()] = true }
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
for (var i = 0, len = HEADERS.length; i < len; ++i) {
|
|
187
|
+
var entry = HEADERS[i];
|
|
188
|
+
if ( !shouldEmit(entry, cfg, url) ) { continue }
|
|
189
|
+
if ( present[entry.header] ) { continue }
|
|
190
|
+
headers[entry.header] = entry.value;
|
|
191
|
+
}
|
|
192
|
+
return headers
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Apply to a header OBJECT that is known to belong to a `/_gina/*` endpoint.
|
|
197
|
+
*
|
|
198
|
+
* Every one of isaac's `_setPoweredByHeader()` call sites is a `/_gina/*`
|
|
199
|
+
* endpoint (measured 29/29, 2026-09-02), and those are deliberately
|
|
200
|
+
* cross-origin: the metrics/health/SSE handlers emit
|
|
201
|
+
* `access-control-allow-origin: *`, and the Inspector's cross-origin GET/SSE
|
|
202
|
+
* channels are a documented design. So the cross-origin-isolating headers are
|
|
203
|
+
* exempted unconditionally here rather than threading `request` through 29
|
|
204
|
+
* writeHead sites — an explicit function beats a synthetic request object.
|
|
205
|
+
*
|
|
206
|
+
* @param {object|undefined} raw - `server.securityHeaders` config
|
|
207
|
+
* @param {object} headers - the header map about to be written
|
|
208
|
+
* @returns {object} the same map, mutated and returned for chaining
|
|
209
|
+
* @example
|
|
210
|
+
* headers = applyToGinaEndpointHeaders(options.securityHeaders, headers);
|
|
211
|
+
*/
|
|
212
|
+
var applyToGinaEndpointHeaders = function(raw, headers) {
|
|
213
|
+
return applyToHeaders(raw, { url: '/_gina/' }, headers);
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
module.exports = {
|
|
217
|
+
applyToResponse : applyToResponse,
|
|
218
|
+
applyToHeaders : applyToHeaders,
|
|
219
|
+
applyToGinaEndpointHeaders : applyToGinaEndpointHeaders,
|
|
220
|
+
// Exposed for unit testing. Do not rely on these in application code.
|
|
221
|
+
_HEADERS : HEADERS,
|
|
222
|
+
_GINA_PREFIX : GINA_PREFIX,
|
|
223
|
+
_shouldEmit : shouldEmit,
|
|
224
|
+
_resolveConfig : resolveConfig
|
|
225
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "gina-lib-sri",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Subresource Integrity attribute computation for emitted asset tags (#OW3)",
|
|
5
|
+
"authors": [
|
|
6
|
+
{
|
|
7
|
+
"name": "Martin Luther ETOUMAN NDAMBWE",
|
|
8
|
+
"email": "contact@gina.io"
|
|
9
|
+
}
|
|
10
|
+
],
|
|
11
|
+
"copyright": "Copyright (c) 2009-2026 Rhinostone <contact@gina.io>",
|
|
12
|
+
"engines": {
|
|
13
|
+
"node": ">=0.10.22"
|
|
14
|
+
},
|
|
15
|
+
"main": "src/main",
|
|
16
|
+
"license": "MIT",
|
|
17
|
+
"readmeFilename": "README.md"
|
|
18
|
+
}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gina — Subresource Integrity (SRI) attribute computation (#OW3, OWASP A08).
|
|
3
|
+
*
|
|
4
|
+
* Computes `integrity="sha384-<base64>" crossorigin="anonymous"` attribute
|
|
5
|
+
* strings for same-origin `<script>` and `<link rel="stylesheet">` tags whose
|
|
6
|
+
* files resolve on disk, so a tampered or truncated asset is refused by the
|
|
7
|
+
* browser instead of executed. Opt-in per bundle via `templates.json >
|
|
8
|
+
* "_common" > "sriEnabled": true` — the controller's resource builder calls
|
|
9
|
+
* this module for every declared asset when that flag is set.
|
|
10
|
+
*
|
|
11
|
+
* DESIGN INVARIANTS — each is deliberate, none is incidental:
|
|
12
|
+
*
|
|
13
|
+
* - FAIL-OPEN, always. Any condition that prevents an honest hash — external
|
|
14
|
+
* URL, unresolvable path, unreadable file, missing configuration — yields
|
|
15
|
+
* an EMPTY attribute string, never a guessed or partial hash. An asset
|
|
16
|
+
* without `integrity` loads exactly as before; an asset with a wrong
|
|
17
|
+
* `integrity` is hard-blocked by the browser. Emitting nothing is the safe
|
|
18
|
+
* degradation by construction.
|
|
19
|
+
* - STAT-VALIDATED CACHE. Hashes are cached per absolute file path, keyed by
|
|
20
|
+
* `mtimeMs` + `size`, and re-validated with one `fs.statSync` per lookup.
|
|
21
|
+
* A rebuilt or re-baked asset therefore gets a fresh hash on the next
|
|
22
|
+
* render with no process restart — the emission side can never serve a
|
|
23
|
+
* stale hash for the bytes on disk. (Pages already stored by the
|
|
24
|
+
* render/output cache keep the hash they were rendered with; flushing that
|
|
25
|
+
* cache after an asset rebuild remains the operator's step.)
|
|
26
|
+
* - sha384, HARDCODED. 48-byte digests base64-encode to exactly 64 characters
|
|
27
|
+
* with ZERO `=` padding — a measured safety property: the server-side asset
|
|
28
|
+
* catalog extracts URLs with an unanchored `(src|href|srcset)=` scan, and a
|
|
29
|
+
* padding-free alphabet makes a false `src="` match inside a hash value
|
|
30
|
+
* structurally impossible. A configurable algorithm (e.g. sha512, whose
|
|
31
|
+
* base64 IS padded) would reopen that hazard, so no knob ships.
|
|
32
|
+
*
|
|
33
|
+
* The cache is module-scope state and this module is registered with a PLAIN
|
|
34
|
+
* `require` in the lib registry — it must not be hot-swapped per request in
|
|
35
|
+
* dev mode (the securityHeadersEmitter / authn precedent for security-bearing
|
|
36
|
+
* leaves), and the cache is only ever a recomputation saver, so staleness
|
|
37
|
+
* across reload boundaries cannot occur by construction.
|
|
38
|
+
*
|
|
39
|
+
* @module sri
|
|
40
|
+
*/
|
|
41
|
+
'use strict';
|
|
42
|
+
|
|
43
|
+
var fs = require('fs');
|
|
44
|
+
var crypto = require('crypto');
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Digest algorithm. Fixed on purpose — see the module header for the
|
|
48
|
+
* padding-free safety property that pins it to sha384.
|
|
49
|
+
*
|
|
50
|
+
* @constant
|
|
51
|
+
* @type {string}
|
|
52
|
+
* @private
|
|
53
|
+
*/
|
|
54
|
+
var ALGORITHM = 'sha384';
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Stat-validated integrity cache.
|
|
58
|
+
* Key: absolute file path. Value: `{ mtimeMs, size, integrity }`.
|
|
59
|
+
* Bounded in practice by the number of distinct assets declared across the
|
|
60
|
+
* bundle's `templates.json` collections (typically a few dozen), so no
|
|
61
|
+
* eviction is needed.
|
|
62
|
+
*
|
|
63
|
+
* @type {object}
|
|
64
|
+
* @private
|
|
65
|
+
*/
|
|
66
|
+
var _cache = {};
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* @typedef {object} SriBundleConf
|
|
70
|
+
* @property {string} publicPath - Absolute path of the bundle's public dir;
|
|
71
|
+
* the fallback root for URL→disk resolution.
|
|
72
|
+
* @property {object} [content] - Bundle content configuration slice.
|
|
73
|
+
* @property {object} [content.statics] - Exact-match URL→absolute-path
|
|
74
|
+
* overrides (from `statics.json`);
|
|
75
|
+
* consulted before `publicPath`.
|
|
76
|
+
*/
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Computes the SRI integrity value for a file on disk.
|
|
80
|
+
*
|
|
81
|
+
* Reads the file synchronously and returns `sha384-<base64>` on success.
|
|
82
|
+
* Returns `null` — never throws — when the file cannot be read: the caller
|
|
83
|
+
* treats `null` as "emit no attribute" (fail-open).
|
|
84
|
+
*
|
|
85
|
+
* A stat-validated cache makes repeat calls cheap: one `fs.statSync` per
|
|
86
|
+
* call, and the file is only re-read when its `mtimeMs` or `size` moved.
|
|
87
|
+
*
|
|
88
|
+
* @function computeIntegrity
|
|
89
|
+
* @memberof module:sri
|
|
90
|
+
* @param {string} filePath - Absolute path of the asset file.
|
|
91
|
+
* @returns {string|null} `sha384-<base64>` (64 base64 chars, no padding), or
|
|
92
|
+
* `null` when the file is missing or unreadable.
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* var sri = require('lib/sri');
|
|
96
|
+
* sri.computeIntegrity('/var/app/public/js/app.js');
|
|
97
|
+
* // => 'sha384-agv0K0aWLDzvDxoOWEsm2s7uAUYBgObriGygDyUIi7eQ/fZ00JWCG74nfkKG5qtv'
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* // Missing file — fail-open, no throw
|
|
101
|
+
* sri.computeIntegrity('/var/app/public/js/deleted.js'); // => null
|
|
102
|
+
*/
|
|
103
|
+
var computeIntegrity = function(filePath) {
|
|
104
|
+
var stats = null;
|
|
105
|
+
try {
|
|
106
|
+
stats = fs.statSync(filePath);
|
|
107
|
+
} catch (statErr) {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
if ( !stats.isFile() ) {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
var cached = _cache[filePath];
|
|
115
|
+
if (
|
|
116
|
+
cached
|
|
117
|
+
&& cached.mtimeMs === stats.mtimeMs
|
|
118
|
+
&& cached.size === stats.size
|
|
119
|
+
) {
|
|
120
|
+
return cached.integrity;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
var content = null;
|
|
124
|
+
try {
|
|
125
|
+
content = fs.readFileSync(filePath);
|
|
126
|
+
} catch (readErr) {
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
var integrity = ALGORITHM + '-' + crypto.createHash(ALGORITHM).update(content).digest('base64');
|
|
131
|
+
_cache[filePath] = {
|
|
132
|
+
mtimeMs : stats.mtimeMs,
|
|
133
|
+
size : stats.size,
|
|
134
|
+
integrity : integrity
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
return integrity;
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Builds the attribute string to splice into an emitted asset tag.
|
|
142
|
+
*
|
|
143
|
+
* Returns ` integrity="sha384-..." crossorigin="anonymous"` — note the
|
|
144
|
+
* LEADING SPACE, so the caller concatenates it directly before the tag's
|
|
145
|
+
* closing bracket — or the EMPTY STRING whenever no honest hash can be
|
|
146
|
+
* produced (fail-open). Never throws.
|
|
147
|
+
*
|
|
148
|
+
* Skipped (empty string returned) for:
|
|
149
|
+
* - external URLs (`scheme://` or protocol-relative `//host/...`) — their
|
|
150
|
+
* bytes are not on this disk;
|
|
151
|
+
* - URLs that resolve to no readable file under the exact-match statics map
|
|
152
|
+
* or the bundle `publicPath` (directory-mapped statics resolve nowhere
|
|
153
|
+
* here and are deliberately left uncovered rather than guessed at);
|
|
154
|
+
* - missing or incomplete bundle configuration.
|
|
155
|
+
*
|
|
156
|
+
* URL handling before resolution: any `?query` / `#fragment` suffix is
|
|
157
|
+
* stripped, and when the emitted URL was prefixed with the bundle webroot
|
|
158
|
+
* (the resource builder mutates URLs that way when a webroot is configured),
|
|
159
|
+
* the prefix is stripped back off so resolution happens against the
|
|
160
|
+
* webroot-free public URL.
|
|
161
|
+
*
|
|
162
|
+
* @function getIntegrityAttributes
|
|
163
|
+
* @memberof module:sri
|
|
164
|
+
* @param {string} url - The asset URL exactly as it will be emitted in the
|
|
165
|
+
* tag (possibly webroot-prefixed).
|
|
166
|
+
* @param {SriBundleConf} conf - Bundle/env configuration slice (needs
|
|
167
|
+
* `publicPath`; `content.statics` optional).
|
|
168
|
+
* @param {string} [webroot='/'] - The bundle webroot; a value other than
|
|
169
|
+
* `'/'` is stripped off `url` when `url`
|
|
170
|
+
* starts with it.
|
|
171
|
+
* @returns {string} ` integrity="..." crossorigin="anonymous"`, or `''`.
|
|
172
|
+
*
|
|
173
|
+
* @example
|
|
174
|
+
* var sri = require('lib/sri');
|
|
175
|
+
* sri.getIntegrityAttributes('/js/vendor/gina/gina.min.js', conf, '/');
|
|
176
|
+
* // => ' integrity="sha384-..." crossorigin="anonymous"'
|
|
177
|
+
*
|
|
178
|
+
* @example
|
|
179
|
+
* // External URL — never hashed from disk
|
|
180
|
+
* sri.getIntegrityAttributes('https://cdn.example.com/lib.js', conf, '/');
|
|
181
|
+
* // => ''
|
|
182
|
+
*
|
|
183
|
+
* @example
|
|
184
|
+
* // Webroot-prefixed URL: '/myapp/js/app.js' resolves as '/js/app.js'
|
|
185
|
+
* sri.getIntegrityAttributes('/myapp/js/app.js', conf, '/myapp/');
|
|
186
|
+
*/
|
|
187
|
+
var getIntegrityAttributes = function(url, conf, webroot) {
|
|
188
|
+
if ( typeof(url) != 'string' || !url ) {
|
|
189
|
+
return '';
|
|
190
|
+
}
|
|
191
|
+
// External assets: scheme-qualified or protocol-relative — not ours to hash.
|
|
192
|
+
if ( /:\/\//.test(url) || url.substring(0, 2) === '//' ) {
|
|
193
|
+
return '';
|
|
194
|
+
}
|
|
195
|
+
if ( !conf || typeof(conf.publicPath) != 'string' || !conf.publicPath ) {
|
|
196
|
+
return '';
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// The on-disk identity ignores query/fragment suffixes.
|
|
200
|
+
var urlPath = url.split(/[?#]/)[0];
|
|
201
|
+
|
|
202
|
+
// Undo the resource builder's webroot prefixing so resolution happens
|
|
203
|
+
// against the webroot-free public URL.
|
|
204
|
+
if (
|
|
205
|
+
typeof(webroot) == 'string'
|
|
206
|
+
&& webroot.length > 1
|
|
207
|
+
&& webroot !== '/'
|
|
208
|
+
&& urlPath.substring(0, webroot.length) === webroot
|
|
209
|
+
) {
|
|
210
|
+
urlPath = '/' + urlPath.substring(webroot.length);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// Exact-match statics mapping wins over the publicPath fallback — same
|
|
214
|
+
// precedence as the server's static resolver.
|
|
215
|
+
var filePath = null;
|
|
216
|
+
if (
|
|
217
|
+
conf.content
|
|
218
|
+
&& conf.content.statics
|
|
219
|
+
&& typeof(conf.content.statics[urlPath]) == 'string'
|
|
220
|
+
) {
|
|
221
|
+
filePath = conf.content.statics[urlPath];
|
|
222
|
+
} else {
|
|
223
|
+
filePath = conf.publicPath + urlPath;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
var integrity = computeIntegrity(filePath);
|
|
227
|
+
if (!integrity) {
|
|
228
|
+
return '';
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
return ' integrity="'+ integrity +'" crossorigin="anonymous"';
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
module.exports = {
|
|
235
|
+
computeIntegrity : computeIntegrity,
|
|
236
|
+
getIntegrityAttributes : getIntegrityAttributes
|
|
237
|
+
};
|
package/gna.js
CHANGED
|
@@ -15,14 +15,14 @@
|
|
|
15
15
|
'use strict';
|
|
16
16
|
|
|
17
17
|
// Framework core — the main gna module (lifecycle hooks, lib, etc.)
|
|
18
|
-
var _gna = require('./framework/v0.6.
|
|
18
|
+
var _gna = require('./framework/v0.6.23/core/gna');
|
|
19
19
|
|
|
20
20
|
// SuperController and EntitySuper — loaded from their source modules
|
|
21
|
-
var SuperController = require('./framework/v0.6.
|
|
22
|
-
var EntitySuper = require('./framework/v0.6.
|
|
21
|
+
var SuperController = require('./framework/v0.6.23/core/controller');
|
|
22
|
+
var EntitySuper = require('./framework/v0.6.23/core/model/entity');
|
|
23
23
|
|
|
24
24
|
// uuid — from the lib registry
|
|
25
|
-
var uuid = require('./framework/v0.6.
|
|
25
|
+
var uuid = require('./framework/v0.6.23/lib/uuid');
|
|
26
26
|
|
|
27
27
|
module.exports = {
|
|
28
28
|
|
package/llms.txt
CHANGED
|
@@ -1039,4 +1039,5 @@ Dev-mode query instrumentation captures every database query tied to the current
|
|
|
1039
1039
|
318. **Validator AJAX bodies are JSON — the Content-Type must say so, on every sender (#FORMCT; query path fixed in #B425).** The browser validator serializes its request bodies with `JSON.stringify`, but its shared `xhrOptions` defaults hardcode `Content-Type: application/x-www-form-urlencoded; charset=UTF-8` (that literal appears exactly once in the whole shipped bundle). When a JSON body goes out under that label the gina server correctly honours it and runs `body.replace(/\+/g, ' ')` plus `decodeURIComponent` BEFORE `JSON.parse` — so a value such as an email `+alias` arrives with the `+` turned into a space. **The failure is silent by construction:** the mangled body is still well-formed JSON, so it parses, no error is raised, and the endpoint answers `200` with a wrong answer. The server half is NOT the bug — for a genuine urlencoded body `+` really does mean space and `%2B` survives the decode — so every fix belongs on the client, at the labelling. **Rule for any new sender: if the body is JSON, resolve the Content-Type as `explicit author declaration, else application/json` — never let the urlencoded default ride a JSON body.** The senders and their state: the form-submit non-binary path and the file-removal POST resolve it correctly (they read an explicit form `enctype` first, else `application/json`); the multipart/binary path sets its own boundary header; a bodiless branch sets a header but sends nothing, so nothing can be corrupted; and the `query` (live-check) request in `core/plugins/lib/validator/src/form-validator.js` was the last one still inheriting the default — fixed by mirroring the same resolution. **Implementation gotcha specific to the query path:** the rule author can override the header per rule (`"headers": { "Content-Type": "application/json" }` inside a rule's `query` block, a supported seam), and that override must keep winning — but the options merge folds the rule block and the defaults into one object, after which a rule-declared `urlencoded` and the inherited default are the same string in the same slot. Provenance is unrecoverable post-merge, so the rule-declared value must be captured BEFORE the merge and consulted afterwards. **Behaviour note at pickup:** live-check bodies now route to the server's parse-verbatim JSON branch, so `+` survives — and `%XX` sequences are no longer URL-decoded either. The client stringifies raw field values without percent-encoding, so no correct consumer depends on that decode, but a bundle that leaned on it will see the literal. **Merge semantics this relies on (measured, and undocumented in the merge JSDoc):** `lib/merge` is variadic — it reads `override` off the LAST argument only when that argument is a boolean, and treats every other argument as an additional source, with EARLIER sources winning and later ones filling gaps. That is why a per-rule header beats the default, and why passing a third object is a merge rather than an override flag.
|
|
1040
1040
|
319. **Controller render data — the dotted-path `set()` contract, and why a first write must never be walked (#P39 slice 2).** Inside `core/controller/controller.js`, every render is preceded by ~60 calls to a local `set('a.b.c', value)` that builds `local.userData` (`page.view.*`, `page.environment.*`, `page.forms`, `gina.csrfToken`, …). Its contract: missing intermediates are created as plain objects and an intermediate that is not a plain object (`null`, an array, a primitive) is REPLACED; at the leaf, **first write wins** (a later `set()` to an existing leaf is ignored — the `override` argument is accepted but inert), an object written onto an existing object leaf **deep-fills** it (missing keys added, existing kept) through `lib/merge`, and **a first-write value is stored by reference and is never walked, copied or mutated**. That last clause is the load-bearing one: `set('page.forms', conf.content.forms)` stores the shared per-process forms catalog, and the previous implementation — a JSON-string path builder + `JSON.parse` + a whole-subtree `merge` — recursed into every grafted object, re-merged each array inside it with itself, and wrote the copies back into the caller's object: 0.4–1.5 ms of CPU per request for a real catalog, and the catalog's arrays silently swapped for equal copies on every render. (That lib-level rewrite of a grafted source — array identity churn at every depth plus SILENT PRIMITIVE DEDUPE — was #B428, fixed in 0.6.19: `lib/merge` now skips a subtree that is the SAME object on both sides — merging a value into itself is identity — so a grafted source keeps its arrays and duplicates and the result references it; object/array references only, equal primitives keep their path; the root-absent `createMode` shallow-copy path is deliberately unchanged. Measured on a 2000-case seeded corpus: identical results and untouched sources for every non-shared merge. Two by-catches were staked out of it: #B436 — FIXED in 0.6.20: staked as 'nested arrays at depth ≥ 2 merge TWICE' (`[1,2,3,4,3,4]`), the MEASURED root was `mergeArray`'s number top-up deciding 'push again' by INDEX rather than by COUNT — any number the target already held at a shifted index was pushed again at EVERY depth (`merge([9,1],[1])` → `[9,1,1]`; `{ports:[8080,8124]}`+`{ports:[8124]}` → `[8080,8124,8124]`), and the depth-≥2 double pass (`browse()` merged arrays in its prop loop and again in the recursion) merely manufactured the shift; the top-up now compares counts (`[25]`+`[25,25]` still `[25,25]`, a present value is never pushed again, merging the same source twice is a no-op) and the prop-loop array merge runs only on the createMode path, so a nested array is merged once and an array SHARED by both sides at depth ≥ 2 keeps its identity (a #B428 residual); #B437 — FIXED in 0.6.20: a target array repeating a primitive (`['v2','v2']`) merged with an array of objects threw `TypeError: Cannot create property 'id' on string`, because `mergeArray`'s object-fill branch tested for a free index on the DEDUPED rebuild of the target and then wrote into the real target, whose index still held the string (or `null`); an occupied index is now left alone, as it already was for an object landing on one.) The rewrite assigns a first write directly and routes only genuine collisions through `merge` at the leaf, so the observable structure is identical (11,550 states differential-tested against the frozen old implementation) while the catalog is left alone; measured ×4.5 on the primitive writes and ×800+ on the catalog write. **Two generalisable traps from that work.** (1) Until 0.6.19 `lib/merge` MUTATED A SOURCE IT GRAFTED: a source subtree grafted by reference at an existing level was walked by the recursion with `src === copy`, every array inside it re-merged with itself and the copies written back into the caller's object — contents preserved, identity churned, cost proportional to the value. #B428's identity guard closed it, and the lesson stands for any merge-like helper that walks a caller's object by reference: measure identity through it before handing it an object you must keep intact. (2) `lib/merge` is VARIADIC and its copy behaviour depends on depth and shape: a value at depth 1 of a call is shallow-copied, deeper values are referenced (and until 0.6.20 a nested array was merged twice on the same level — once in the graft loop, once in the recursion). The array contract is now in its JSDoc (#B436); still read `browse()` before reasoning about identity through merge, and prefer a measured differential test over a model of it.
|
|
1041
1041
|
320. **`route.request()` settles its caller exactly once - an outbound-request failure is an error argument, never a hang and never a bundle kill (#B442, 0.6.21).** The routing helper's outbound call (`getRoute(...).request([ignoreWebRoot,] options[, cb])`) DISCARDED the `ClientRequest` returned by `http(s).get`, so nothing could ever attach an `'error'` listener to it. Three consequences, all removed: (a) a dial failure whose code is carved out of the process-level uncaughtException handler (`ECONNREFUSED`/`ECONNRESET`/`EPIPE`/...) left the caller waiting FOREVER with nothing logged - a permanent wedge in any serialized consumer (a worker at concurrency 1, a queue processor), and the SILENCE is the defect, not the carve-out; (b) a code that is NOT carved out (`ETIMEDOUT`, `EHOSTUNREACH`, `ENETUNREACH` - i.e. a peer that stops answering or a route that goes away) escalated to `uncaughtException` and took the bundle down through the process-level `dismiss(pid, 'SIGTERM')`; (c) a response stream dying mid-body assigned its error to a local and waited for an `'end'` event that never arrives, so the assigned error was never delivered either. All four exit paths now run through ONE single-settle latch (`settled` flag + `settle()`), so the callback receives an ordinary error argument - the shape consuming code already handles - and can never be invoked twice. **`options.timeout` was INERT and looked like a consumer workaround:** it does reach `http(s).get`, but Node only EMITS `'timeout'` and never destroys the socket, and the request object was unreachable, so nobody could listen or act. It is now honoured - on expiry the request is destroyed and the callback settles with an `Error` carrying `code === 'ETIMEDOUT'`; absent/falsy `options.timeout` attaches no timeout listener, so the behaviour is opt-in. The no-callback (fire-and-forget) branch attaches its own `'error'` listener and `console.warn`s, so a call nobody awaited can no longer kill the process. Same defect class as the `store()` / `copyFile` movers (#B223/#B227): capture every request or stream you create, listen on BOTH ends, and latch the settle. **`lib/routing` IS browser-bundled** (aliased in the plugin `build.json`), so this ships in `gina.min.js` as well as server-side - pickup is a bundle restart AND a re-bake. Regression test: `test/lib/routing-request-settle.test.js` - source pins plus extract-and-execute behavioural arms driving the real shipped bytes against a fake agent; note the function region is brace-UNBALANCED (a `/^\{/` regex literal in the end handler), so the extraction is terminator-anchored on `} // EO route.request()` and a brace walker must NOT be substituted for it.
|
|
1042
|
-
321. **`merge()` array-element hardening - a null (or hole) element in an id-keyed array is an element with no key, never a crash (#B436/#B437/#B443 arc).** `typeof null == 'object'`, so `mergeArray`'s collection paths historically dereferenced null elements and threw `TypeError: Cannot read properties of null` - and because every configuration overlay and collection merge travels through `lib/merge`, any such shape was a whole-merge (often whole-boot) kill. The hardened contract, in layers: the WRITE side (0.6.20) - the index-merge branch tests for a free slot on the real target, and an occupied slot (a primitive or null left where the deduped rebuild had a hole) is skipped, never written into; number top-up is by COUNT, not index, so merges are idempotent (`[25]+[25,25]` gives `[25,25]`, `[9,1]+[1]` stays `[9,1]`). The READ side (0.6.21) - both collection ENTRY guards null-check the TARGET operand (they already checked the source), both id-ROSTER loops and both WALKS skip a null element, and the per-element collection tests null-check the SOURCE operand; a null element matches nothing, blocks nothing and contributes nothing. Semantics otherwise unchanged and pinned: a target whose slots are primitives/null keeps them (`[null,null]+[{id:1},{id:2}]` returns `[null,null]`, same as `['v2','v2']+...`), and an object BEHIND a primitive/null head is dropped by the per-element branch (pre-existing, `['x',{id:9}]+[{id:1}]` returns `['x']`). `lib/merge` is browser-bundled (aliased in the plugin `build.json`), so array-merge fixes ship in `gina.min.js` too - pickup is a bundle restart AND a re-bake. Regression suites: `test/lib/merge-b436.test.js`, `merge-b437.test.js`, `merge-b443.test.js` (behavioural arms driving the real lib + comment-stripped source pins + artifact-derived dist pins, all red-first validated). **#B446 — the same `for...in` loops are also a prototype-pollution sink.** `merge()` enumerated SOURCE keys with bare `for...in` at five sites (`:136`, `:197`, `:208`, `:237`, `:547` pre-fix; the lone `hasOwnProperty` at `:548` guards the TARGET, not the source), so an OWN `__proto__` key — exactly what `JSON.parse` yields, and what `core/server.js:6657` feeds it on the PUT path — walked through to `Object.prototype`. ⚠️ Subtler still: merge reads `src = target[name]` THROUGH the prototype chain, so with its documented target-wins-on-conflict rule a polluted value BEAT a default the source literal owned (measured: `rejectUnauthorized` flipping true→false on the query-options defaults). All five loops now reject `__proto__`/`constructor`/`prototype` BY NAME — that name check is the whole guard, and it is REQUIRED because own-property checking alone cannot see a JSON-parsed `__proto__` (an own key satisfies an own check by construction). ⚠️ The first cut ALSO skipped non-own keys as extra hardening and that was REVERTED before release:
|
|
1042
|
+
321. **`merge()` array-element hardening - a null (or hole) element in an id-keyed array is an element with no key, never a crash (#B436/#B437/#B443 arc).** `typeof null == 'object'`, so `mergeArray`'s collection paths historically dereferenced null elements and threw `TypeError: Cannot read properties of null` - and because every configuration overlay and collection merge travels through `lib/merge`, any such shape was a whole-merge (often whole-boot) kill. The hardened contract, in layers: the WRITE side (0.6.20) - the index-merge branch tests for a free slot on the real target, and an occupied slot (a primitive or null left where the deduped rebuild had a hole) is skipped, never written into; number top-up is by COUNT, not index, so merges are idempotent (`[25]+[25,25]` gives `[25,25]`, `[9,1]+[1]` stays `[9,1]`). The READ side (0.6.21) - both collection ENTRY guards null-check the TARGET operand (they already checked the source), both id-ROSTER loops and both WALKS skip a null element, and the per-element collection tests null-check the SOURCE operand; a null element matches nothing, blocks nothing and contributes nothing. Semantics otherwise unchanged and pinned: a target whose slots are primitives/null keeps them (`[null,null]+[{id:1},{id:2}]` returns `[null,null]`, same as `['v2','v2']+...`), and an object BEHIND a primitive/null head is dropped by the per-element branch (pre-existing, `['x',{id:9}]+[{id:1}]` returns `['x']`). `lib/merge` is browser-bundled (aliased in the plugin `build.json`), so array-merge fixes ship in `gina.min.js` too - pickup is a bundle restart AND a re-bake. Regression suites: `test/lib/merge-b436.test.js`, `merge-b437.test.js`, `merge-b443.test.js` (behavioural arms driving the real lib + comment-stripped source pins + artifact-derived dist pins, all red-first validated). **#B446 — the same `for...in` loops are also a prototype-pollution sink.** `merge()` enumerated SOURCE keys with bare `for...in` at five sites (`:136`, `:197`, `:208`, `:237`, `:547` pre-fix; the lone `hasOwnProperty` at `:548` guards the TARGET, not the source), so an OWN `__proto__` key — exactly what `JSON.parse` yields, and what `core/server.js:6657` feeds it on the PUT path — walked through to `Object.prototype`. ⚠️ Subtler still: merge reads `src = target[name]` THROUGH the prototype chain, so with its documented target-wins-on-conflict rule a polluted value BEAT a default the source literal owned (measured: `rejectUnauthorized` flipping true→false on the query-options defaults). All five loops now reject `__proto__`/`constructor`/`prototype` BY NAME — that name check is the whole guard, and it is REQUIRED because own-property checking alone cannot see a JSON-parsed `__proto__` (an own key satisfies an own check by construction). ⚠️ The first cut ALSO skipped non-own keys as extra hardening and that was REVERTED before release: the model layer round-trips entity instances through `merge()` — the in-tree path is the relations assembly (`core/model/entity.js`); the registry's `setModel` (`lib/model.js`) has no in-tree caller but is published through the `modelUtil` context and stays consumer-reachable — and all six SQL connectors attach their `.sql`-derived query methods to the PROTOTYPE, so own-only copying silently dropped every query method (`db.<x>Entity.getOneById is not a function`) while constructor-assigned methods survived — a partial, hard-to-attribute breakage caught by a consumer on the unpublished tree, never shipped. `merge()` walks the prototype chain, as it always has; only the three key names are refused. Regression suite: `test/lib/merge-entity-prototype.test.js` (red-first validated against the own-guard build). The `src`-read is deliberately left prototype-reachable — closing it would change documented conflict semantics for objects that legitimately inherit, and is tracked separately. **#B450 — the plain-object check itself CRASHED on shadowed `constructor` keys (pre-existing, measured identical on shipped 0.6.21).** `isObject()`'s eager `hasMethodPrototyped` compute (a "node > v6" edit that broke jQuery isPlainObject's short-circuit) read `.prototype` off an OWN `constructor` value, so `{"job":{"constructor":<primitive|null|{}|[]>}}` — FIVE measured shapes — threw `Cannot convert undefined or null to object` from any PUT body BEFORE the key filter could drop the name (the guard rejects keys at COPY time; this crash fired in the type predicate deciding recursion, one level up). Fixed by restoring the lazy short-circuit and guarding the `.prototype` read; a 24-shape differential sweep pins IDENTICAL answers on every input the old form did not crash on — so the recurse-vs-graft routing (plain objects recurse into fresh clones; class instances and functions graft by REFERENCE, which config singletons and instance registries rely on) is unchanged, and every crash shape now yields the disclosed drop-the-key behaviour with sibling fields surviving. Regression suite: `test/lib/merge-b450.test.js` (red-first: the five crash arms + boolean sibling fail on the pre-fix predicate; pollution/entity/graft controls green on both revisions).
|
|
1043
|
+
322. **OWASP Top 10 response — framework-side security headers, request-body bounds, opt-in SRI (#OW1/#OW2/#OW3, 0.6.23).** Three framework-layer hardenings shipped together. **#OW1 headers:** `settings.json > server.securityHeaders` — the framework itself emits security headers on BOTH engines, because the #HDR plugins are express middleware and the default isaac engine never runs the express chain for HTTP responses (`server.use` middlewares are only ever drained by the WebSocket session binder against an inert response), so a mounted `SecurityHeaders()` orchestrator emitted NOTHING there; the emitter (`lib/security-headers-emitter`) is the framework-side twin of the #HDR8 hidePoweredBy gate. Tier A on by default (cannot break a working app): x-content-type-options / x-download-options / x-permitted-cross-domain-policies / x-xss-protection / referrer-policy / x-dns-prefetch-control / origin-agent-cluster. Tier B opt-in, one key each, each with a NAMED breakage: xFrameOptions (cross-origin embedding) / coop (severs window.opener — OAuth/payment popups) / corp (conflicts with gina's own `access-control-allow-origin: *` on `/_gina/*`) / hsts (180-day commitment, emitted over http too). First-writer-wins (a mounted plugin / `env.json` header / upstream proxy beats the framework default); coop/corp never applied to `/_gina/*`; header VALUES are asserted in tests against each plugin's own exported constant so framework and mounted plugin cannot diverge; `server.hidePoweredBy` default flipped to `true` (note the render-cache interaction: with the cache enabled and `server.cache.name` unset, the boot warning about `Cache-Status` still naming the framework fires — set a token there). `server.securityHeaders.enabled: false` restores the previous behaviour. **#OW2 body bounds:** `server.maxBodySize` (`"64MB"`, ENFORCED: 413 + `request.destroy()`, plus a `_bodyRejected` guard on the `end` handler because destroy racing buffered chunks would otherwise double-respond) and `server.maxBodySizeWarn` (`"2MB"`, warn-only) bound non-multipart bodies counting RAW wire bytes (a multi-byte UTF-8 body is larger on the wire than its decoded string length); `0` disables either; B/KB/MB/GB accepted (bare number = MB); multipart stays under the `upload.*` caps; `server.timeout` is exposed and defaults to `0` DELIBERATELY — a finite whole-request clock kills SSE/WebSocket, and the slow-body case is closed by the cap. **#OW3 SRI:** `templates.json > "_common" > "sriEnabled": true` (default false, bare boolean per that file's `*Enabled` convention) makes the controller's resource builder add ` integrity="sha384-..." crossorigin="anonymous"` to same-origin `<script>` AND `<link rel=stylesheet>` tags whose files resolve on disk — including `gina.min.js`/`gina.min.css`, which ride the framework conf's `_common` collections through the same emission path. `lib/sri` is FAIL-OPEN always (external `://` and protocol-relative `//` URLs, unresolvable paths, unreadable files, missing conf → NO attribute, never a guess — an absent attribute loads as before, a wrong one hard-blocks); resolution = query/fragment strip → webroot un-prefix → `content.statics[url]` exact match → `publicPath + url` (directory-mapped statics resolve nowhere → fail-open, deliberate); the hash cache is STAT-VALIDATED (mtimeMs + size, one statSync per lookup) so a rebuilt/re-baked asset re-hashes on the next render with NO restart — but pages already stored by the render/output cache keep the hash they were rendered with, so flush that cache after an asset rebuild; the HTTP/2 preload hint is SUPPRESSED for SRI'd assets (a hint carries no integrity metadata — a mismatched preload is a wasted double-fetch); sha384 is HARDCODED as a measured safety property (48-byte digest → 64 base64 chars, ZERO `=` padding, keeping integrity values structurally inert to the asset catalog's unanchored `(src|href|srcset)=` scan — sha512's padded base64 would reopen that hazard, so no algorithm knob ships); coverage caveats, both fail-safe: popin re-creates injected scripts copying only `src` (SRI not enforced on popin-injected loads) and the client loader's dynamic gina.min.css injection is likewise uncovered. Pickup: all three are server-side — bundle restart, no dist rebuild (`lib/sri` is not browser-bundled).
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gina",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.23",
|
|
4
4
|
"description": "MVC framework for Node.js and Bun with built-in HTTP/2, multi-bundle architecture, and scope-based data isolation — no Express dependency",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"nodejs",
|
|
@@ -76,12 +76,12 @@
|
|
|
76
76
|
"gina-container": "bin/gina-container",
|
|
77
77
|
"gina-init": "bin/gina-init"
|
|
78
78
|
},
|
|
79
|
-
"main": "./framework/v0.6.
|
|
79
|
+
"main": "./framework/v0.6.23/core/gna",
|
|
80
80
|
"exports": {
|
|
81
81
|
".": {
|
|
82
82
|
"types": "./types/index.d.ts",
|
|
83
83
|
"import": "./index.mjs",
|
|
84
|
-
"require": "./framework/v0.6.
|
|
84
|
+
"require": "./framework/v0.6.23/core/gna.js"
|
|
85
85
|
},
|
|
86
86
|
"./gna": {
|
|
87
87
|
"types": "./types/gna.d.ts",
|