gina 0.3.7-alpha.8 → 0.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -1
- package/ROADMAP.md +5 -4
- package/framework/v0.3.7/VERSION +1 -0
- package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +20 -8
- package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/js/gina.js +157 -0
- package/framework/v0.3.7/core/asset/plugin/dist/vendor/gina/js/gina.min.js +545 -0
- package/framework/v0.3.7/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- package/framework/v0.3.7/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
- package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/controller/controller.js +33 -0
- package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/index.js +3 -1
- package/framework/v0.3.7/core/plugins/lib/csrf/README.md +113 -0
- package/framework/v0.3.7/core/plugins/lib/csrf/package.json +22 -0
- package/framework/v0.3.7/core/plugins/lib/csrf/src/main.js +584 -0
- package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/session/src/main.js +14 -2
- package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/validator/src/form-validator.js +70 -0
- package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/validator/src/main.js +83 -0
- package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/server.js +2 -0
- package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle/index.js +7 -0
- package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/conf/settings.json +22 -0
- package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/routing/src/main.js +4 -0
- package/framework/{v0.3.7-alpha.8 → v0.3.7}/package.json +1 -1
- package/gna.js +4 -4
- package/llms.txt +8 -0
- package/package.json +2 -2
- package/framework/v0.3.7-alpha.8/VERSION +0 -1
- package/framework/v0.3.7-alpha.8/core/asset/plugin/dist/vendor/gina/js/gina.min.js +0 -544
- package/framework/v0.3.7-alpha.8/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- package/framework/v0.3.7-alpha.8/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/AUTHORS +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/LICENSE +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/html/nolayout.html +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/html/static.html +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/img/android-chrome-192x192.png +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/img/android-chrome-512x512.png +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/img/apple-touch-icon.png +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/img/favicon-16x16.png +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/img/favicon-32x32.png +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/img/favicon.ico +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/README.md +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/config.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/ai/index.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/ai/lib/connector.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/couchbase/index.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/couchbase/lib/connector.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/couchbase/lib/connector.v2.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/couchbase/lib/connector.v3.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/couchbase/lib/connector.v4.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/couchbase/lib/n1ql.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/couchbase/lib/session-store.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/couchbase/lib/session-store.v2.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/couchbase/lib/session-store.v4.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/mysql/index.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/mysql/lib/connector.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/postgresql/index.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/postgresql/lib/connector.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/redis/index.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/redis/lib/session-store.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/sql-parser.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/sqlite/index.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/sqlite/lib/connector.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/sqlite/lib/session-store.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/content.encoding +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/controller/controller.framework.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/controller/controller.render-json.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/controller/controller.render-nunjucks.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/controller/controller.render-stream.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/controller/controller.render-swig.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/controller/controller.render-v1.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/controller/index.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/deps/busboy-1.6.0/LICENSE +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/deps/busboy-1.6.0/README.md +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/deps/busboy-1.6.0/lib/index.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/deps/busboy-1.6.0/lib/types/multipart.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/deps/busboy-1.6.0/lib/types/urlencoded.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/deps/busboy-1.6.0/lib/utils.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/deps/busboy-1.6.0/package.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/deps/streamsearch-1.1.0/LICENSE +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/deps/streamsearch-1.1.0/lib/sbmh.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/deps/streamsearch-1.1.0/package.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/dev/index.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/dev/lib/class.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/dev/lib/factory.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/dev/lib/tools.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/gna.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/locales/README.md +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/locales/currency.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/locales/dist/language/en.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/locales/dist/language/fr.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/locales/dist/region/en.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/locales/dist/region/fr.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/locales/index.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/mime.types +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/model/entity.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/model/index.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/model/template/entityFactory.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/model/template/index.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/README.md +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/file/README.md +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/file/build.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/file/package.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/intl/README.md +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/intl/build.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/intl/package.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/intl/src/main.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/session/README.md +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/session/package.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/storage/README.md +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/storage/build.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/storage/package.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/storage/src/main.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/validator/README.md +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/validator/build.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/validator/package.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/router.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/server.express.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/server.isaac.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/status.codes +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/_gitignore +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle/config/app.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle/config/connectors.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle/config/routing.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle/config/settings.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle/config/templates.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle/config/watchers.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle_public/css/default.css +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle_public/css/home.css +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle_public/readme.md +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/command/gina.bat.tpl +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/command/gina.tpl +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/conf/env.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/conf/manifest.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/conf/package.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/conf/statics.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/conf/templates.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/error/client/json/401.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/error/client/json/403.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/error/client/json/404.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/error/server/html/50x.html +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/error/server/json/500.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/error/server/json/503.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/extensions/logger/config.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/console.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/context.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/data/LICENSE +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/data/README.md +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/data/package.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/data/src/main.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/dateFormat.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/index.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/json/LICENSE +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/json/README.md +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/json/package.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/json/src/main.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/path.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/plugins/README.md +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/plugins/package.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/plugins/src/api-error.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/plugins/src/main.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/prototypes.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/task.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/text.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/archiver/README.md +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/archiver/build.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/archiver/package.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/archiver/src/dep/jszip.min.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/archiver/src/main.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/async/package.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/async/src/main.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cache/README.md +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cache/build.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cache/package.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cache/src/main.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/aliases.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/add.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/arguments.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/build.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/copy.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/cp.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/help.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/help.txt +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/list.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/mcp-start.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/mcp.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/oas.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/openapi.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/remove.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/rename.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/restart.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/rm.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/start.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/status.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/stop.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/cache/stats.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/connector/add.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/connector/arguments.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/connector/help.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/connector/help.txt +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/connector/list.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/connector/migrate.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/connector/remove.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/connector/rm.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/env/add.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/env/get.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/env/help.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/env/help.txt +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/env/link-dev.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/env/list.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/env/remove.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/env/rm.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/env/set.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/env/unset.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/env/use.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/arguments.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/build.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/dot.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/get.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/help.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/help.txt +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/init.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/link-node-modules.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/link.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/msg.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/open.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/restart.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/set.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/start.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/status.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/stop.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/tail.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/update.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/version.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/gina-dev.1.md +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/gina-framework.1.md +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/gina.1.md +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/helper.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/index.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/inspector/help.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/inspector/help.txt +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/inspector/open.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/minion/help.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/minion/help.txt +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/msg.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/port/help.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/port/help.txt +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/port/inc/scan.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/port/list.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/port/reset.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/port/set.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/project/add.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/project/arguments.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/project/build.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/project/help.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/project/help.txt +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/project/import.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/project/list.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/project/move.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/project/remove.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/project/rename.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/project/restart.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/project/rm.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/project/start.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/project/status.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/project/stop.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/protocol/help.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/protocol/help.txt +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/protocol/list.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/protocol/set.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/scope/add.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/scope/help.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/scope/help.txt +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/scope/link-local.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/scope/link-production.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/scope/list.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/scope/remove.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/scope/rm.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/scope/use.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/service/help.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/service/help.txt +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/service/list.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/view/add.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/collection/README.md +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/collection/build.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/collection/package.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/collection/src/main.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/config.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/connector-registry/package.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/connector-registry/src/main.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cron/README.md +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cron/package.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cron/src/main.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/domain/LICENSE +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/domain/README.md +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/domain/package.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/domain/src/main.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/generator/index.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/index.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/inherits/LICENSE +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/inherits/README.md +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/inherits/package.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/inherits/src/main.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/inspector-redact/package.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/inspector-redact/src/main.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/logger/README.md +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/logger/package.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/logger/src/containers/default/index.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/logger/src/containers/file/index.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/logger/src/containers/mq/index.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/logger/src/containers/mq/listener.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/logger/src/containers/mq/speaker.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/logger/src/helper.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/logger/src/main.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/math/index.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/mcp-dispatch/package.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/mcp-dispatch/src/main.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/mcp-http/package.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/mcp-http/src/main.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/mcp-server/package.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/mcp-server/src/main.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/merge/README.md +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/merge/package.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/merge/src/main.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/model.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/nunjucks-filters/README.md +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/nunjucks-filters/package.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/nunjucks-filters/src/main.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/nunjucks-resolver/package.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/nunjucks-resolver/src/main.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/proc.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/routing/README.md +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/routing/build.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/routing/package.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/routing/src/radix.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/routing-introspect/package.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/routing-introspect/src/main.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/session-store.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/shell.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/state.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/swig-filters/README.md +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/swig-filters/package.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/swig-filters/src/main.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/swig-resolver/package.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/swig-resolver/src/main.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/url/README.md +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/url/index.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/url/routing.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/uuid/package.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/uuid/src/main.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/validator.js +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/watcher/package.json +0 -0
- /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/watcher/src/main.js +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -6,12 +6,29 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html),
|
|
|
6
6
|
and is generated by [Changie](https://github.com/miniscruff/changie).
|
|
7
7
|
|
|
8
8
|
|
|
9
|
+
## 0.3.7 - 2026-04-26
|
|
10
|
+
### Added
|
|
11
|
+
* Released `0.3.7` — cumulative stable of the `0.3.7-alpha.1` through `0.3.7-alpha.10` cycle. Headline tracks: **Web Security CSRF trilogy** (`gina.plugins.Session()` cookie hardening + `gina.plugins.Csrf()` signed double-submit token middleware + Origin/Referer pre-filter; OWASP ASVS 4.0 V4.2.1 aligned; opt-in plugin shape; per-route `csrfExempt: true` for webhook receivers). **Nunjucks template engine opt-in** (`render.engine = "nunjucks"` per bundle; filter parity #NJ1, setResources/asset injection #NJ2, render cache #NJ3, Early Hints 103 auto-send #NJ4). **MCP server** (`bundle:mcp` static manifest emit + `bundle:mcp-start` stdio and HTTP transports; #AI8 Phases 1/2a/2b). **Connector CLI** (`connector:list/add/rm/migrate`; #CN10). **Eval-safety hardening** (#SCS1 family — collection safe-evaluator + validator-plugin grammar-locked walker replacements; vendored-dep CVE-visibility invariant locked in via OSV scan workflow). Supply-chain trim (`psl` swap for vendored MPL-2.0 PSL data, `optimist` removal). Release-pipeline hardening (`gna.js` stable-version sync at framework-dir rename, StateStore + gina.db sync across renames, asset-plugin build honours `--gzip-bin`/`--brotli-bin` overrides). Plus `Session.name` drop-in identity restoration in alpha.10. See per-alpha sections for per-feature detail and test counts; full suite 3822/3822 at the stable cut.
|
|
12
|
+
|
|
13
|
+
## 0.3.7-alpha.10 - 2026-04-26 (npm only — no git tag)
|
|
14
|
+
### Fixed
|
|
15
|
+
* `gina.plugins.Session()` no longer clobbers the wrapper's `Function.name` property. Bundles that introspect the wrapper (`require('gina').plugins.Session(require('express-session')).name`) now see `'session'` (matching upstream) instead of `'ginaSession'`. Achieved via a small refactor: the outer wrapper delegates to an inner `ginaSessionDispatch` named function, with `Object.defineProperty(wrapped, 'name', { value: expressSession.name, configurable: true })` overriding the outer `.name`. The inner `ginaSessionDispatch` frame stays visible in stack traces, so gina remains detectable for debugging while the public-facing identity is the upstream's. Static-surface preservation (`Store`, `MemoryStore`, `Session`, `Cookie`) and the SameSite=None invariant are unchanged. 2 new unit tests in `test/core/session-plugin.test.js` (drop-in identity assertion + stack-trace visibility lock). Full suite 3768/3768 (3766 baseline + 2 new). Surfaced from a freelancer/v3 session: "Gina's wrapper clobbering expressSession.name — is an upstream concern".
|
|
16
|
+
### Security
|
|
17
|
+
* `gina.plugins.Csrf()` now layers an Origin/Referer pre-filter ON TOP of the signed double-submit token verify (`#CSRF3`). On every mutating request (POST/PUT/PATCH/DELETE) the middleware reads `Origin` first, falls back to parsing the host out of `Referer` when `Origin` is absent (or is the literal `"null"` sentinel browsers send for sandboxed iframes), and matches the result against `settings.json > csrf.allowedOrigins`. Both headers missing → 403 `[csrf] forbidden — missing origin/referer`. Mismatch → 403 `[csrf] forbidden — origin not allowed`. The token verify only runs after the Origin check passes, so a forged token + matching cookie still gets rejected when the request didn't come from an allowed origin (token layer ≠ Origin layer). Per-route `csrfExempt: true` bypasses BOTH layers consistently. New `settings.json` key `csrf.allowedOrigins`: empty/unset defaults to `[bundleHostname]` (auto-derived from `conf[bundle][env].hostname` or composed from `server.scheme + host + server.port`); non-empty replaces the default with an explicit allowlist for multi-domain bundles. Entries are matched literally case-insensitive after parsing down to `scheme://host[:port]` — different scheme on the same host doesn't match (`http://example.com` ≠ `https://example.com`); different port doesn't match. Factory throws at startup when `csrf.allowedOrigins` is empty AND no bundle hostname can be resolved — error message points at both fixes. 54 new unit tests (parser helpers, allowlist precedence, behavioural matrix Origin × Referer × allowlist, scheme/port discrimination, `Origin: "null"` sentinel handling, negative-invariant lock that matching token + mismatching Origin still 403s, exempt interaction, source-inspection guards pinning the pre-filter ordering); full suite 3822/3822 (prior 3768 + 54). Closes the three-phase CSRF trilogy started by `#CSRF1` (cookie hardening, alpha.8) and `#CSRF2` (signed double-submit token, alpha.9).
|
|
18
|
+
|
|
19
|
+
## 0.3.7-alpha.9 - 2026-04-26 (npm only — no git tag)
|
|
20
|
+
### Added
|
|
21
|
+
* Exposed gina.csrfToken and gina.csrfInput in swig template context (#CSRF2 follow-up). When a bundle has registered the Csrf plugin and req.csrfToken is set on the active request, controller.js > setOptions() now publishes two keys to the template data: gina.csrfToken (raw base64url string) and gina.csrfInput (pre-formatted <input type="hidden" name="<fieldName>" value="<token>"> HTML). Templates render the hidden input with either {{ gina.csrfInput | safe }} or the manual <input ... value="{{ gina.csrfToken }}"> form. The field name comes from settings.json > csrf.fieldName (default _csrf, matching the plugin) and is HTML-attribute-escaped defensively (& " < >) before interpolation. The token itself is base64url ([A-Za-z0-9_-]) by construction so it is interpolated verbatim — encoding it would break round-trip when the form is submitted. When req.csrfToken is absent (bundle has not adopted the plugin) neither key is set; templates can guard with {% if gina.csrfToken %}. 25 unit tests in test/core/controller-csrf-context.test.js cover the source-inspection guards, the missing/empty/non-string rejection, the configured-fieldName path, the four HTML-attribute escapes, and the negative invariant (no eval, no template-literal interpolation, no encoding of the token).
|
|
22
|
+
### Security
|
|
23
|
+
* Added gina.plugins.Csrf() — signed double-submit token CSRF middleware (#CSRF2). New core/plugins/lib/csrf/ middleware sits in the Express drain after the Session plugin. Token shape: HMAC-SHA256(sessionId + ':' + nonce_b64url, GINA_CSRF_SECRET); nonce is 16 bytes from crypto.getRandomValues; both halves base64url-encoded; verify uses crypto.timingSafeEqual with a length guard. Mutating methods (POST/PUT/PATCH/DELETE) require a matching value in X-Gina-CSRF-Token header or _csrf form field; safe methods (GET/HEAD/OPTIONS) issue a token cookie and pass through. Per-route opt-out via routing.json > "csrfExempt": true for webhook receivers (Stripe, GitHub, etc.) — positive-assertion key chosen so a misread breaks the webhook (obvious) rather than CSRF-vulnerable (silent). Stateless so it scales with distributed Redis/K8s sessions without server-side storage; signed so sibling subdomains cannot inject cookies. Adoption is two lines in the bundle bootstrap, AFTER the session middleware: var csrf = require('gina').plugins.Csrf(); app.use(csrf). Server secret (GINA_CSRF_SECRET, generate with openssl rand -base64 64) is required at factory-call time — there is no dev fallback. Sessionless or session-after-csrf misorder produces a clear next(err) message that points at the fix ("Csrf plugin requires the Session plugin to be registered before it"). Settings template seeds csrf.{cookieName,headerName,fieldName,rotate,safeMethods}; the secret is never stored in settings. server.js + lib/routing/src/main.js propagate routing[name].csrfExempt to req.routing.csrfExempt next to cache and queryTimeout. 69 unit tests in test/core/csrf-plugin.test.js (source-inspection guards, generateToken/verifyToken primitives, negative-invariant lock against ==/===/Buffer.compare/.includes on the token path, issue + verify middlewares end-to-end through stub req/res, per-route exempt, plugin registration, settings template integrity). Full suite 3714/3714. Followups in commit 2 (validator AJAX header injection) + commit 3 (controller template context) close the user-facing surface; this commit ships the verify gate and the seam.
|
|
24
|
+
* Validator AJAX requests now inject the X-Gina-CSRF-Token header on mutating methods (#CSRF2 follow-up). The browser-side validator plugin reads the gina-csrf-token cookie (set by the Csrf plugin) and adds the matching X-Gina-CSRF-Token request header on POST/PUT/PATCH/DELETE XHR calls; safe methods (GET/HEAD/OPTIONS) bypass injection. Three injection sites covered: form-submit XHR (core/plugins/lib/validator/src/main.js header loop), file-removal DELETE/POST (same file, xhrOptions block), and live-validation queries (core/plugins/lib/validator/src/form-validator.js). Adds two pure helpers — readCsrfCookie() (parses document.cookie via indexOf+slice; no regex on user-controlled segments; URL-decodes the token; returns null when absent) and isMutatingMethod() (returns false for GET/HEAD/OPTIONS, true for everything else). Cookie name (gina-csrf-token) and header name (X-Gina-CSRF-Token) hardcoded to match the plugin defaults — settings.json overrides apply server-side only; if a bundle changes the names, the validator fall-back is to ship no header (safe — server rejects, dev sees 403). Browser bundle (dist/vendor/gina/js/gina.*) rebuilt because both validator src files are aliased into the client-side AMD tree via build.json. Negative invariant locked: no eval, no Function constructor in the new helper region. 27 unit tests in test/core/validator-csrf-injection.test.js (source-inspection guards pinning the three injection sites, readCsrfCookie pure-parser behaviour, isMutatingMethod safe-method bypass, end-to-end XHR stub coverage of cookie-present/cookie-absent x mutating/safe matrix, eval / new Function rejection). Full suite 3766/3766 (3739 baseline + 27 new).
|
|
25
|
+
|
|
9
26
|
## 0.3.7-alpha.8 - 2026-04-25 (npm only — no git tag)
|
|
10
27
|
### Fixed
|
|
11
28
|
* StateStore + gina.db now stay in sync with main.json/settings.json across framework-directory renames during `bumpVersion`. Closes a silent drift that affected every alpha cut for several versions and required manual SQLite patches. Two failure modes addressed: relative `require('../state')` resolution after the rename invalidated the generator's `__dirname`, and `StateStore._homeDir` returning null in build-script context where `GINA_HOMEDIR` isn't injected. Future violators of either invariant now log a visible warning instead of silently falling through to a JSON-sidecar-only write.
|
|
12
29
|
* `framework/v*/core/asset/plugin/build` now honours the `--gzip-bin` and `--brotli-bin` CLI overrides. Six `-exec gzip -9 -n -k` / `-exec brotli --best` calls were hardcoded and silently defeated the flags; they now use the `${gzip_bin}` / `${brotli_bin}` variables resolved via `which` or set by the user.
|
|
13
30
|
|
|
14
|
-
## 0.3.7-alpha.7 - 2026-04-25
|
|
31
|
+
## 0.3.7-alpha.7 - 2026-04-25 (npm only — no git tag)
|
|
15
32
|
### Fixed
|
|
16
33
|
* Schema `$schema` identifier updated from `http://json-schema.org/draft-07/schema#` to `https://json-schema.org/draft-07/schema#` across all seven `schema/*.json` files (app, app.crons, connectors, manifest, routing, settings, watchers). The plain-HTTP form redirects to HTTPS and is bot-blocked by json-schema.org; IDEs and JSON validators that dereference the identifier at validation time were hitting the 302/403 chain instead of fetching the canonical schema. Matches the URI shown in the JSON Schema draft-07 spec and aligns with the `$id` field, which already uses `https://`. First batch from the link-health audit (gina-io/gina#18).
|
|
17
34
|
* Refreshed stale URL references in code comments and man pages across the framework (link-health audit gina-io/gina#18): `core/template/boilerplate/bundle/controllers/setup.js` — dropped reference to the deleted `github.com/jmcmanus/pagedown-extra` repo (the commented-out example code uses `marked`, not pagedown-extra; the link was misleading even before the repo died). `core/connectors/couchbase/lib/session-store.v{2,3,4}.js` — updated `github.com/visionmedia/connect-redis` to `github.com/tj/connect-redis` (the maintainer renamed; old URL still 302s but relying on a stale redirect chain is brittle). `core/locales/README.md` — replaced `currency-iso.org/en/home/tables/table-a1.html` (folded into a SIX Swiss Exchange commercial page) with the canonical `iso.org/iso-4217-currency-codes.html`. `lib/cmd/gina.1.md`, `gina-dev.1.md`, `gina-framework.1.md` — modernised the `groups.google.com/forum/#!forum/ginajs` mailing-list link to the supported `groups.google.com/g/ginajs` URL format. The Google Group itself is still active; only the hash-bang URL format is obsolete. `core/server.js` — dropped dead `strongloop.com/strongblog/...` blog-post reference (domain TLS-broken, StrongLoop dissolved into IBM in 2015, the blog post is not reachable via any successor) and dead `jsperf.com/arraybuffer-string-conversion/4` test reference (410 Gone; jsperf relaunched on Cloudflare but the historical test data was not restored). Comment-only changes; no runtime behaviour modified.
|
package/ROADMAP.md
CHANGED
|
@@ -28,6 +28,7 @@ This roadmap covers planned features, architectural improvements, new connectors
|
|
|
28
28
|
| --- | --- | --- | --- |
|
|
29
29
|
| ✅ | **Automatic version migration** — Upgrading or downgrading gina (e.g. `0.1.x → 0.2.0`, `0.5.x → 1.0.0`) automatically migrates `~/.gina/` config to the new version on first startup. Downgrade is free — old version data is never removed. | `0.1.8` | 2026-03-26 |
|
|
30
30
|
| ✅ | **`watchers.json`** — First-class bundle config for file watchers. Declare watchers on config files with event-based notification (no polling). Foundation for the dev-mode hot-reload system. | `0.2.0` | 2026-03-29 |
|
|
31
|
+
| 📋 | **i18n core** — Per-bundle message catalogs under `bundle/locales/<culture>.json` with a fallback chain (specific culture → base language → default). Server-side `t(key, [params], [culture])` global helper with parameter interpolation and CLDR pluralisation. Swig and Nunjucks filters with the same surface (`{{ "key"\|t }}`, `{{ "key"\|t({ name: x }) }}`). Per-request locale negotiation from URL prefix / cookie / `Accept-Language` / settings default. CLI: `gina i18n:scan` for missing-key coverage per culture, `i18n:add <culture>` to seed a new catalog, `i18n:export` / `i18n:import` for `.po` / `.csv` / `.json` round-trip with translators. Headless by design — the visual translation editor lands later as the first content feature in Beemaster (admin Phase 3). | `0.3.8` | Q2 2026 |
|
|
31
32
|
| 📋 | **PWA scaffold** — `gina bundle:add` drops `manifest.json`, a service worker stub (`sw.js`), and the required `<meta>` / `<link>` tags into the bundle boilerplate. Zero runtime dependency. Enables Gina apps to be installed on mobile as PWAs without additional tooling. | `0.4.0` | Q4 2026 |
|
|
32
33
|
| ✅ | **Per-bundle framework version** — Declare `"gina_version": "0.1.8"` on any bundle entry in `manifest.json` to pin that bundle to a specific installed framework version. The socket server continues running its own version; only the spawned bundle process uses the declared version. Validated against the tracked version list in `main.json` before start. `--gina-version=X.Y.Z` flag on `bundle:start` provides the same override without touching config files. | `0.3.0` | 2026-03-31 |
|
|
33
34
|
| ✅ | **PATCH method** — `req.patch` populated with the parsed request body (JSON or form-encoded). `req.body` aliases `req.patch`. URI params merged. `"method": "PATCH"` valid in `routing.json`. Use PATCH for partial updates (only sent fields change) vs PUT which replaces the full resource. | `0.3.0` | 2026-03-31 |
|
|
@@ -137,13 +138,13 @@ Complete the removal of `eval` / `new Function` call sites from the published ta
|
|
|
137
138
|
|
|
138
139
|
## Web Security
|
|
139
140
|
|
|
140
|
-
Cross-site request forgery protection. Three-phase defense-in-depth plan aligned with OWASP ASVS 4.0 V4.2.1; each phase shippable on its own.
|
|
141
|
+
Cross-site request forgery protection. Three-phase defense-in-depth plan aligned with OWASP ASVS 4.0 V4.2.1; each phase shippable on its own. All three phases shipped: cookie hardening in `0.3.7-alpha.8`, signed double-submit token middleware in `0.3.7-alpha.9`, Origin/Referer pre-filter in `0.3.7-alpha.10`.
|
|
141
142
|
|
|
142
143
|
| Status | Feature | Version | Target |
|
|
143
144
|
| --- | --- | --- | --- |
|
|
144
145
|
| ✅ | **Cookie hardening (baseline)** — Opt-in plugin `gina.plugins.Session` wraps `express-session` and injects `SameSite=Lax` + `HttpOnly` + `Secure=auto` defaults from `settings.json > session.cookie.{sameSite,httpOnly,secure}` into the cookie options before the middleware sees them. Bundle-supplied cookie options always win, so intentional configuration is preserved. Adoption is a one-line swap in the bundle bootstrap: `var session = require('gina').plugins.Session(require('express-session'))`. Browser-parity invariant enforced at factory call time: `SameSite=None` without `Secure` throws at bundle startup. Migration guide flags cross-site cookie-send bundles (rare — third-party OAuth embeds, iframe flows) that must set `sameSite: "none"` + `secure: true` explicitly. 41 unit tests (source-inspection guards + mergeCookie + invariant negative-lock + resolveSettingsDefaults + end-to-end through stub express-session + registration + template integrity). | `0.3.7-alpha.8` | 2026-04-24 |
|
|
145
|
-
|
|
|
146
|
-
|
|
|
146
|
+
| ✅ | **Signed double-submit token middleware** — Stateless signed-double-submit-cookie pattern (OWASP ASVS 4.0 V4.2.1). Opt-in plugin `gina.plugins.Csrf()`: HMAC-SHA256 cookie bound to session ID + matching `X-Gina-CSRF-Token` header (or `_csrf` form field) required on POST/PUT/PATCH/DELETE; `timingSafeEqual` comparison; safe methods (GET/HEAD/OPTIONS) pass through. Per-route opt-out via `routing.json > "csrfExempt": true` for webhook receivers (Stripe, GitHub, etc.). Server secret read from `process.env.GINA_CSRF_SECRET` at factory-call time — no dev fallback. Sessionless or session-after-csrf misorder produces a clear `next(err)` message pointing at the fix. Stateless so it scales with distributed Redis/K8s sessions without server-side storage; signed so sibling subdomains cannot inject cookies. 69 unit tests (source-inspection guards, generateToken/verifyToken primitives, negative-invariant lock, issue + verify middlewares, per-route exempt, plugin registration, settings template integrity). Validator AJAX header injection + controller template context (`{{ gina.csrfToken }}` / `{{ gina.csrfInput \| safe }}`) ship in follow-up commits. | `0.3.7-alpha.9` | 2026-04-25 |
|
|
147
|
+
| ✅ | **Origin/Referer pre-filter** — Secondary check on mutating methods, layered on top of the token middleware INSIDE `gina.plugins.Csrf()`: parses `Origin` first, falls back to the host portion of `Referer`, and matches against `settings.json > csrf.allowedOrigins`. Both headers missing → 403 `missing origin/referer`. Mismatch → 403 `origin not allowed`. Empty/unset `allowedOrigins` defaults to `[bundleHostname]` (auto-derived from `conf[bundle][env].hostname` or composed from `server.scheme + host + server.port`); non-empty = explicit allowlist for multi-domain bundles. Per-route `csrfExempt: true` bypasses BOTH Origin and token layers consistently. Negative-invariant lock: matching token + mismatching Origin still 403s — token layer ≠ Origin layer. Factory throws at startup when neither a settings allowlist nor a bundle hostname can be resolved. 54 unit tests added (parseRequestOrigin/parseOriginString helpers, resolveBundleHostname, resolveAllowedOrigins precedence, behavioural matrix Origin × Referer × allowlist, scheme/port discrimination, `Origin: "null"` sentinel handling, negative-invariant lock, exempt interaction, source-inspection guards pinning the pre-filter ordering). Full suite 3822/3822 (prior 3768 + 54). | `0.3.7-alpha.10` | 2026-04-26 |
|
|
147
148
|
|
|
148
149
|
---
|
|
149
150
|
|
|
@@ -286,7 +287,7 @@ Windows compatibility is a hard requirement for `1.0.0`. The alpha scope covers
|
|
|
286
287
|
|
|
287
288
|
## Inspector
|
|
288
289
|
|
|
289
|
-
Gina's built-in per-bundle inspector. Phases 1–2 ship as an embedded SPA at `/_gina/inspector/` inside every bundle's own HTTP server (dev mode). Phase 3 evolves it into a standalone web app served by `services/src/inspector/` that can connect to any bundle in any environment — including production. Beemaster (global admin app) is a separate project.
|
|
290
|
+
Gina's built-in per-bundle inspector. Phases 1–2 ship as an embedded SPA at `/_gina/inspector/` inside every bundle's own HTTP server (dev mode). Phase 3 evolves it into a standalone web app served by `services/src/inspector/` that can connect to any bundle in any environment — including production. Beemaster (global admin app) is a separate project — also the planned home for content-management surfaces such as the **i18n translation editor** (the visual layer of i18n core).
|
|
290
291
|
|
|
291
292
|
**Why a standalone web app:** Electron is heavy and adds distribution burden. A browser extension is browser-specific and can't inspect from a different machine. The standalone web app works locally and remotely, any browser, zero install. A browser extension companion can be layered on top later.
|
|
292
293
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.3.7
|
|
@@ -70,8 +70,8 @@
|
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
:root {
|
|
73
|
-
--font:
|
|
74
|
-
--sans:
|
|
73
|
+
--font: 'SF Mono', 'Fira Code', 'Cascadia Code', Menlo, 'Lucida Grande', monospace;
|
|
74
|
+
--sans: 'Lucida Grande', Lucida, Arial, Helvetica, sans-serif;
|
|
75
75
|
--radius: 4px;
|
|
76
76
|
--hdr: 32px;
|
|
77
77
|
}
|
|
@@ -830,8 +830,6 @@ body {
|
|
|
830
830
|
cursor: pointer;
|
|
831
831
|
padding: 4px;
|
|
832
832
|
transition: border-color 0.15s, background 0.15s;
|
|
833
|
-
/* Reveal toggle — red tint when active so the unredacted state is visually
|
|
834
|
-
distinct from the regular amber `.active` state used by RAW / fold-all. */
|
|
835
833
|
}
|
|
836
834
|
.bm-icon-btn svg {
|
|
837
835
|
width: 14px;
|
|
@@ -855,6 +853,10 @@ body {
|
|
|
855
853
|
.bm-icon-btn.bm-hidden {
|
|
856
854
|
display: none;
|
|
857
855
|
}
|
|
856
|
+
.bm-icon-btn {
|
|
857
|
+
/* Reveal toggle — red tint when active so the unredacted state is visually
|
|
858
|
+
distinct from the regular amber `.active` state used by RAW / fold-all. */
|
|
859
|
+
}
|
|
858
860
|
.bm-icon-btn#bm-reveal.active {
|
|
859
861
|
border-color: var(--err);
|
|
860
862
|
background: rgba(231, 76, 60, 0.12);
|
|
@@ -1724,9 +1726,6 @@ details[open] > summary.bm-summary::before {
|
|
|
1724
1726
|
cursor: pointer;
|
|
1725
1727
|
user-select: none;
|
|
1726
1728
|
position: relative;
|
|
1727
|
-
/* Extend accent line to bridge the gap between consecutive selected rows */
|
|
1728
|
-
/* Rounded corners on first/last of contiguous selected group */
|
|
1729
|
-
/* Single-click copy feedback — green flash + checkmark */
|
|
1730
1729
|
}
|
|
1731
1730
|
.bm-log:hover {
|
|
1732
1731
|
background: var(--bg3);
|
|
@@ -1734,11 +1733,13 @@ details[open] > summary.bm-summary::before {
|
|
|
1734
1733
|
.bm-log.bm-log-selected {
|
|
1735
1734
|
background: rgba(242, 175, 13, 0.13);
|
|
1736
1735
|
border-bottom-color: transparent;
|
|
1737
|
-
/* Left accent line — straight, unaffected by border-radius */
|
|
1738
1736
|
}
|
|
1739
1737
|
.bm-log.bm-log-selected:hover {
|
|
1740
1738
|
background: rgba(242, 175, 13, 0.19);
|
|
1741
1739
|
}
|
|
1740
|
+
.bm-log.bm-log-selected {
|
|
1741
|
+
/* Left accent line — straight, unaffected by border-radius */
|
|
1742
|
+
}
|
|
1742
1743
|
.bm-log.bm-log-selected::before {
|
|
1743
1744
|
content: "";
|
|
1744
1745
|
position: absolute;
|
|
@@ -1757,9 +1758,15 @@ details[open] > summary.bm-summary::before {
|
|
|
1757
1758
|
[data-theme=light] .bm-log.bm-log-selected:hover {
|
|
1758
1759
|
background: rgba(200, 133, 10, 0.16);
|
|
1759
1760
|
}
|
|
1761
|
+
.bm-log {
|
|
1762
|
+
/* Extend accent line to bridge the gap between consecutive selected rows */
|
|
1763
|
+
}
|
|
1760
1764
|
.bm-log.bm-log-selected + .bm-log-selected::before {
|
|
1761
1765
|
top: -1px;
|
|
1762
1766
|
}
|
|
1767
|
+
.bm-log {
|
|
1768
|
+
/* Rounded corners on first/last of contiguous selected group */
|
|
1769
|
+
}
|
|
1763
1770
|
.bm-log.bm-log-selected:not(.bm-log-selected + .bm-log) {
|
|
1764
1771
|
border-radius: 6px 6px 0 0;
|
|
1765
1772
|
}
|
|
@@ -1778,6 +1785,9 @@ details[open] > summary.bm-summary::before {
|
|
|
1778
1785
|
.bm-log.bm-log-selected:not(.bm-log-selected + .bm-log):not(:has(+ .bm-log-selected))::before {
|
|
1779
1786
|
border-radius: 3px 0 0 3px;
|
|
1780
1787
|
}
|
|
1788
|
+
.bm-log {
|
|
1789
|
+
/* Single-click copy feedback — green flash + checkmark */
|
|
1790
|
+
}
|
|
1781
1791
|
.bm-log.bm-log-row-copied {
|
|
1782
1792
|
background: rgba(76, 175, 80, 0.15) !important;
|
|
1783
1793
|
}
|
|
@@ -3603,3 +3613,5 @@ details[open] > summary.bm-summary::before {
|
|
|
3603
3613
|
text-align: left;
|
|
3604
3614
|
}
|
|
3605
3615
|
}
|
|
3616
|
+
|
|
3617
|
+
/*# sourceMappingURL=inspector.css.map */
|
|
@@ -2866,6 +2866,68 @@ function FormValidatorUtil(data, $fields, xhrOptions, fieldsSet) {
|
|
|
2866
2866
|
var dateFormat = (isGFFCtx) ? require('helpers/dateFormat') : helpers.dateFormat;
|
|
2867
2867
|
var routing = (isGFFCtx) ? require('lib/routing') : require('../../../../../lib/routing');
|
|
2868
2868
|
|
|
2869
|
+
/**
|
|
2870
|
+
* #CSRF2 follow-up — read the gina-csrf-token cookie set by the Csrf plugin.
|
|
2871
|
+
*
|
|
2872
|
+
* Pure, dependency-free parser for `document.cookie`. Returns the token
|
|
2873
|
+
* value (URL-decoded) or null when the cookie is absent. Browser-only
|
|
2874
|
+
* (isGFFCtx); when running outside a browser document, returns null.
|
|
2875
|
+
*
|
|
2876
|
+
* No eval / Function / regex on user-controlled segments — name and
|
|
2877
|
+
* value are compared as plain strings via indexOf + slice only.
|
|
2878
|
+
*
|
|
2879
|
+
* @returns {string|null}
|
|
2880
|
+
* */
|
|
2881
|
+
var readCsrfCookie = function () {
|
|
2882
|
+
var name = 'gina-csrf-token';
|
|
2883
|
+
if ( typeof(document) === 'undefined' || !document || typeof(document.cookie) !== 'string' ) {
|
|
2884
|
+
return null;
|
|
2885
|
+
}
|
|
2886
|
+
var raw = document.cookie || '';
|
|
2887
|
+
if (!raw) {
|
|
2888
|
+
return null;
|
|
2889
|
+
}
|
|
2890
|
+
var parts = raw.split(';');
|
|
2891
|
+
for (var i = 0, len = parts.length; i < len; ++i) {
|
|
2892
|
+
var part = parts[i];
|
|
2893
|
+
while (part.charAt(0) === ' ' || part.charAt(0) === '\t') {
|
|
2894
|
+
part = part.slice(1);
|
|
2895
|
+
}
|
|
2896
|
+
var eq = part.indexOf('=');
|
|
2897
|
+
if (eq < 0) {
|
|
2898
|
+
continue;
|
|
2899
|
+
}
|
|
2900
|
+
var key = part.slice(0, eq);
|
|
2901
|
+
if (key !== name) {
|
|
2902
|
+
continue;
|
|
2903
|
+
}
|
|
2904
|
+
var val = part.slice(eq + 1);
|
|
2905
|
+
try {
|
|
2906
|
+
return decodeURIComponent(val);
|
|
2907
|
+
} catch (e) {
|
|
2908
|
+
return val;
|
|
2909
|
+
}
|
|
2910
|
+
}
|
|
2911
|
+
return null;
|
|
2912
|
+
};
|
|
2913
|
+
|
|
2914
|
+
/**
|
|
2915
|
+
* #CSRF2 follow-up — true for HTTP methods that mutate state.
|
|
2916
|
+
*
|
|
2917
|
+
* GET, HEAD, OPTIONS are CSRF-safe by spec. All other methods require
|
|
2918
|
+
* the X-Gina-CSRF-Token header.
|
|
2919
|
+
*
|
|
2920
|
+
* @param {string} method
|
|
2921
|
+
* @returns {boolean}
|
|
2922
|
+
* */
|
|
2923
|
+
var isMutatingMethod = function (method) {
|
|
2924
|
+
if ( typeof(method) !== 'string' || !method ) {
|
|
2925
|
+
return false;
|
|
2926
|
+
}
|
|
2927
|
+
var m = method.toUpperCase();
|
|
2928
|
+
return (m !== 'GET' && m !== 'HEAD' && m !== 'OPTIONS');
|
|
2929
|
+
};
|
|
2930
|
+
|
|
2869
2931
|
var hasUserValidators = function() {
|
|
2870
2932
|
|
|
2871
2933
|
var _hasUserValidators = false, formsContext = null;
|
|
@@ -3232,6 +3294,14 @@ function FormValidatorUtil(data, $fields, xhrOptions, fieldsSet) {
|
|
|
3232
3294
|
xhr.setRequestHeader('Content-Type', enctype);
|
|
3233
3295
|
}
|
|
3234
3296
|
|
|
3297
|
+
// #CSRF2 follow-up — inject X-Gina-CSRF-Token on mutating methods (live-validation path)
|
|
3298
|
+
if ( isMutatingMethod(queryOptions.method) ) {
|
|
3299
|
+
var csrfToken = readCsrfCookie();
|
|
3300
|
+
if (csrfToken) {
|
|
3301
|
+
xhr.setRequestHeader('X-Gina-CSRF-Token', csrfToken);
|
|
3302
|
+
}
|
|
3303
|
+
}
|
|
3304
|
+
|
|
3235
3305
|
var onResult = function(result) {
|
|
3236
3306
|
|
|
3237
3307
|
_this.value = local['data'][_this.name] = (_this.value) ? _this.value.toLowerCase() : _this.value;
|
|
@@ -5031,6 +5101,10 @@ function Routing() {
|
|
|
5031
5101
|
if ( typeof(routeObject.cache) != 'undefined' ) {
|
|
5032
5102
|
params.cache = routeObject.cache;
|
|
5033
5103
|
}
|
|
5104
|
+
// #CSRF2 — propagate per-route Csrf opt-out to req.routing.csrfExempt
|
|
5105
|
+
if ( typeof(routeObject.csrfExempt) != 'undefined' ) {
|
|
5106
|
+
params.csrfExempt = routeObject.csrfExempt;
|
|
5107
|
+
}
|
|
5034
5108
|
if ( typeof(routeObject.queryTimeout) != 'undefined' ) {
|
|
5035
5109
|
params.queryTimeout = parseTimeout(routeObject.queryTimeout);
|
|
5036
5110
|
}
|
|
@@ -9582,6 +9656,74 @@ function ValidatorPlugin(rules, data, formId) {
|
|
|
9582
9656
|
}
|
|
9583
9657
|
};
|
|
9584
9658
|
|
|
9659
|
+
/**
|
|
9660
|
+
* #CSRF2 follow-up — read the gina-csrf-token cookie set by the Csrf plugin.
|
|
9661
|
+
*
|
|
9662
|
+
* Pure, dependency-free parser for `document.cookie`. Returns the token
|
|
9663
|
+
* value (URL-decoded) or null when the cookie is absent. Browser-only
|
|
9664
|
+
* (isGFFCtx); when running outside a browser document, returns null.
|
|
9665
|
+
*
|
|
9666
|
+
* Default cookie name is 'gina-csrf-token' matching the Csrf plugin
|
|
9667
|
+
* settings.json default. The matching X-Gina-CSRF-Token header is
|
|
9668
|
+
* injected on mutating methods (POST/PUT/PATCH/DELETE) before xhr.send().
|
|
9669
|
+
*
|
|
9670
|
+
* No eval / Function / regex on user-controlled segments — name and
|
|
9671
|
+
* value are compared as plain strings via indexOf + slice only.
|
|
9672
|
+
*
|
|
9673
|
+
* @returns {string|null}
|
|
9674
|
+
* */
|
|
9675
|
+
var readCsrfCookie = function () {
|
|
9676
|
+
var name = 'gina-csrf-token';
|
|
9677
|
+
if ( typeof(document) === 'undefined' || !document || typeof(document.cookie) !== 'string' ) {
|
|
9678
|
+
return null;
|
|
9679
|
+
}
|
|
9680
|
+
var raw = document.cookie || '';
|
|
9681
|
+
if (!raw) {
|
|
9682
|
+
return null;
|
|
9683
|
+
}
|
|
9684
|
+
var parts = raw.split(';');
|
|
9685
|
+
for (var i = 0, len = parts.length; i < len; ++i) {
|
|
9686
|
+
var part = parts[i];
|
|
9687
|
+
// strip leading whitespace without regex
|
|
9688
|
+
while (part.charAt(0) === ' ' || part.charAt(0) === '\t') {
|
|
9689
|
+
part = part.slice(1);
|
|
9690
|
+
}
|
|
9691
|
+
var eq = part.indexOf('=');
|
|
9692
|
+
if (eq < 0) {
|
|
9693
|
+
continue;
|
|
9694
|
+
}
|
|
9695
|
+
var key = part.slice(0, eq);
|
|
9696
|
+
if (key !== name) {
|
|
9697
|
+
continue;
|
|
9698
|
+
}
|
|
9699
|
+
var val = part.slice(eq + 1);
|
|
9700
|
+
try {
|
|
9701
|
+
return decodeURIComponent(val);
|
|
9702
|
+
} catch (e) {
|
|
9703
|
+
return val;
|
|
9704
|
+
}
|
|
9705
|
+
}
|
|
9706
|
+
return null;
|
|
9707
|
+
};
|
|
9708
|
+
|
|
9709
|
+
/**
|
|
9710
|
+
* #CSRF2 follow-up — true for HTTP methods that mutate state.
|
|
9711
|
+
*
|
|
9712
|
+
* GET, HEAD, OPTIONS are CSRF-safe by spec (they MUST NOT carry side
|
|
9713
|
+
* effects). All other methods (POST, PUT, PATCH, DELETE, ...) require
|
|
9714
|
+
* the X-Gina-CSRF-Token header.
|
|
9715
|
+
*
|
|
9716
|
+
* @param {string} method
|
|
9717
|
+
* @returns {boolean}
|
|
9718
|
+
* */
|
|
9719
|
+
var isMutatingMethod = function (method) {
|
|
9720
|
+
if ( typeof(method) !== 'string' || !method ) {
|
|
9721
|
+
return false;
|
|
9722
|
+
}
|
|
9723
|
+
var m = method.toUpperCase();
|
|
9724
|
+
return (m !== 'GET' && m !== 'HEAD' && m !== 'OPTIONS');
|
|
9725
|
+
};
|
|
9726
|
+
|
|
9585
9727
|
/**
|
|
9586
9728
|
* backend definitions
|
|
9587
9729
|
* */
|
|
@@ -10471,6 +10613,14 @@ function ValidatorPlugin(rules, data, formId) {
|
|
|
10471
10613
|
xhr.setRequestHeader(hearder, options.headers[hearder]);
|
|
10472
10614
|
}
|
|
10473
10615
|
|
|
10616
|
+
// #CSRF2 follow-up — inject X-Gina-CSRF-Token on mutating methods
|
|
10617
|
+
if ( isMutatingMethod(options.method) ) {
|
|
10618
|
+
var csrfToken = readCsrfCookie();
|
|
10619
|
+
if (csrfToken) {
|
|
10620
|
+
xhr.setRequestHeader('X-Gina-CSRF-Token', csrfToken);
|
|
10621
|
+
}
|
|
10622
|
+
}
|
|
10623
|
+
|
|
10474
10624
|
if (xhr) {
|
|
10475
10625
|
// catching ready state cb
|
|
10476
10626
|
// Data loading ...
|
|
@@ -11544,6 +11694,13 @@ function ValidatorPlugin(rules, data, formId) {
|
|
|
11544
11694
|
'X-Requested-With': 'XMLHttpRequest' // in case of cross domain origin
|
|
11545
11695
|
}
|
|
11546
11696
|
};
|
|
11697
|
+
// #CSRF2 follow-up — inject X-Gina-CSRF-Token on mutating methods (file remove → DELETE/POST)
|
|
11698
|
+
if ( isMutatingMethod(method) ) {
|
|
11699
|
+
let csrfToken = readCsrfCookie();
|
|
11700
|
+
if (csrfToken) {
|
|
11701
|
+
xhrOptions.headers['X-Gina-CSRF-Token'] = csrfToken;
|
|
11702
|
+
}
|
|
11703
|
+
}
|
|
11547
11704
|
let xhr = setupXhr(xhrOptions);
|
|
11548
11705
|
//handleXhr(xhr);
|
|
11549
11706
|
if ( /GET|DELETE/i.test(method) ) {
|