gina 0.5.26 → 0.6.0
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 +22 -0
- package/README.md +34 -22
- package/ROADMAP.md +43 -16
- package/bin/cli +12 -1
- package/bin/gina-init +15 -1
- package/framework/v0.6.0/VERSION +1 -0
- package/framework/{v0.5.26 → v0.6.0}/core/asset/plugin/dist/vendor/gina/js/gina.js +36 -1
- package/framework/v0.6.0/core/asset/plugin/dist/vendor/gina/js/gina.min.js +601 -0
- package/framework/v0.6.0/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- package/framework/v0.6.0/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
- package/framework/{v0.5.26 → v0.6.0}/core/connectors/couchbase/lib/session-store.v3.js +52 -84
- package/framework/{v0.5.26 → v0.6.0}/core/connectors/couchbase/lib/session-store.v4.js +58 -84
- package/framework/{v0.5.26 → v0.6.0}/core/connectors/mongodb/lib/session-store.js +5 -2
- package/framework/{v0.5.26 → v0.6.0}/core/connectors/redis/lib/session-store.js +5 -2
- package/framework/{v0.5.26 → v0.6.0}/core/connectors/scylladb/lib/session-store.js +5 -2
- package/framework/{v0.5.26 → v0.6.0}/core/connectors/sqlite/lib/session-store.js +17 -3
- package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/session/src/main.js +142 -9
- package/framework/{v0.5.26 → v0.6.0}/core/router.js +101 -11
- package/framework/{v0.5.26 → v0.6.0}/core/server.js +91 -1
- package/framework/{v0.5.26 → v0.6.0}/core/template/conf/settings.json +3 -0
- package/framework/v0.6.0/lib/audit/src/main.js +916 -0
- package/framework/v0.6.0/lib/authn/package.json +7 -0
- package/framework/v0.6.0/lib/authn/src/lockout.js +615 -0
- package/framework/v0.6.0/lib/authn/src/main.js +899 -0
- package/framework/v0.6.0/lib/authn/src/totp.js +418 -0
- package/framework/v0.6.0/lib/cmd/audit/arguments.json +5 -0
- package/framework/v0.6.0/lib/cmd/audit/help.txt +50 -0
- package/framework/v0.6.0/lib/cmd/audit/verify.js +294 -0
- package/framework/{v0.5.26 → v0.6.0}/lib/cmd/framework/init.js +11 -0
- package/framework/{v0.5.26 → v0.6.0}/lib/cmd/framework/tail.js +5 -1
- package/framework/{v0.5.26 → v0.6.0}/lib/cmd/gina.1.md +1 -0
- package/framework/{v0.5.26 → v0.6.0}/lib/index.js +13 -0
- package/framework/{v0.5.26 → v0.6.0}/lib/logger/src/containers/file/index.js +11 -1
- package/framework/{v0.5.26 → v0.6.0}/lib/logger/src/containers/mq/speaker.js +8 -1
- package/framework/v0.6.0/lib/net-locality/package.json +17 -0
- package/framework/v0.6.0/lib/net-locality/src/main.js +174 -0
- package/framework/{v0.5.26 → v0.6.0}/lib/nunjucks-filters/src/main.js +13 -0
- package/framework/{v0.5.26 → v0.6.0}/lib/routing/src/main.js +36 -1
- package/framework/{v0.5.26 → v0.6.0}/lib/swig-filters/src/main.js +13 -0
- package/framework/{v0.5.26 → v0.6.0}/package.json +1 -1
- package/gna.js +4 -4
- package/llms.txt +19 -2
- package/package.json +3 -3
- package/schema/connectors.json +2 -3
- package/schema/settings.json +101 -0
- package/types/index.d.ts +4 -0
- package/framework/v0.5.26/VERSION +0 -1
- package/framework/v0.5.26/core/asset/plugin/dist/vendor/gina/js/gina.min.js +0 -599
- package/framework/v0.5.26/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- package/framework/v0.5.26/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
- package/framework/v0.5.26/lib/audit/src/main.js +0 -456
- /package/framework/{v0.5.26 → v0.6.0}/AUTHORS +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/LICENSE +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/asset/html/nolayout.html +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/asset/html/static.html +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/asset/img/android-chrome-192x192.png +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/asset/img/android-chrome-512x512.png +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/asset/img/apple-touch-icon.png +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/asset/img/favicon-16x16.png +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/asset/img/favicon-32x32.png +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/asset/img/favicon.ico +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/asset/plugin/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/config.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/connectors/ai/index.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/connectors/ai/lib/connector.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/connectors/couchbase/index.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/connectors/couchbase/lib/connector.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/connectors/couchbase/lib/connector.v3.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/connectors/couchbase/lib/connector.v4.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/connectors/couchbase/lib/n1ql.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/connectors/couchbase/lib/session-store.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/connectors/mongodb/index.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/connectors/mongodb/lib/connector.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/connectors/mongodb/lib/job-store.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/connectors/mongodb/lib/pipeline-loader.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/connectors/mysql/index.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/connectors/mysql/lib/connector.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/connectors/postgresql/index.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/connectors/postgresql/lib/connector.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/connectors/redis/index.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/connectors/redis/lib/connector.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/connectors/redis/lib/job-store.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/connectors/redis/lib/render-cache-store.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/connectors/scylladb/index.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/connectors/scylladb/lib/connector.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/connectors/sql-parser.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/connectors/sqlite/index.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/connectors/sqlite/lib/connector.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/connectors/sqlite/lib/job-store.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/content.encoding +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/controller/controller.framework.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/controller/controller.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/controller/controller.render-json.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/controller/controller.render-nunjucks-async.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/controller/controller.render-nunjucks.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/controller/controller.render-stream.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/controller/controller.render-swig-async.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/controller/controller.render-swig.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/controller/controller.render-v1.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/controller/index.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/controller/inspector-window-emit.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/controller/release-banner.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/dev/index.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/dev/lib/class.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/dev/lib/factory.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/dev/lib/tools.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/gna.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/locales/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/locales/currency.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/locales/dist/language/en.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/locales/dist/language/fr.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/locales/dist/region/en.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/locales/dist/region/fr.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/locales/index.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/mime.types +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/model/entity.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/model/index.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/model/template/entityFactory.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/model/template/index.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/index.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/csrf/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/csrf/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/csrf/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/coep/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/coep/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/coep/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/coop/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/coop/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/coop/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/corp/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/corp/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/corp/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/csp/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/csp/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/csp/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/hide-powered-by/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/hide-powered-by/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/hide-powered-by/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/hsts/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/hsts/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/hsts/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/origin-agent-cluster/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/origin-agent-cluster/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/origin-agent-cluster/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/referrer-policy/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/referrer-policy/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/referrer-policy/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/x-content-type-options/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/x-content-type-options/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/x-content-type-options/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/x-dns-prefetch-control/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/x-dns-prefetch-control/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/x-dns-prefetch-control/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/x-download-options/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/x-download-options/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/x-download-options/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/x-frame-options/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/x-frame-options/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/x-frame-options/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/x-xss-protection/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/x-xss-protection/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/security-headers/x-xss-protection/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/session/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/session/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/storage/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/storage/build.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/storage/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/storage/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/validator/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/validator/build.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/validator/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/validator/src/form-validator.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/plugins/lib/validator/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/server.express.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/server.isaac.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/status.codes +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/_gitignore +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/boilerplate/bundle/config/app.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/boilerplate/bundle/config/connectors.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/boilerplate/bundle/config/routing.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/boilerplate/bundle/config/settings.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/boilerplate/bundle/config/templates.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/boilerplate/bundle/config/watchers.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/boilerplate/bundle/index.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/boilerplate/bundle/locales/en.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/boilerplate/bundle_public/css/default.css +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/boilerplate/bundle_public/css/home.css +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/boilerplate/bundle_public/js/components/x-checklist.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/boilerplate/bundle_public/manifest.webmanifest +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/boilerplate/bundle_public/readme.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/boilerplate/bundle_public/sw.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/boilerplate/bundle_templates/html/includes/x-checklist.html +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/command/gina.bat.tpl +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/command/gina.tpl +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/conf/env.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/conf/manifest.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/conf/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/conf/statics.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/conf/templates.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/error/client/json/401.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/error/client/json/403.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/error/client/json/404.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/error/server/html/50x.html +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/error/server/json/500.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/error/server/json/503.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/core/template/extensions/logger/config.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/helpers/console.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/helpers/context.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/helpers/data/LICENSE +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/helpers/data/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/helpers/data/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/helpers/data/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/helpers/dateFormat.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/helpers/index.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/helpers/json/LICENSE +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/helpers/json/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/helpers/json/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/helpers/json/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/helpers/path.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/helpers/plugins/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/helpers/plugins/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/helpers/plugins/src/api-error.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/helpers/plugins/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/helpers/prototypes.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/helpers/task.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/helpers/text.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/admin/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/admin/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/archiver/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/archiver/build.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/archiver/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/archiver/src/dep/jszip.min.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/archiver/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/async/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/async/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/audit/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/audit-store.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/authz-gate/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/authz-gate/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cache/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cache/build.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cache/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cache/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/aliases.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/bundle/add.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/bundle/arguments.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/bundle/build.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/bundle/copy.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/bundle/cp.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/bundle/help.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/bundle/help.txt +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/bundle/inc/name-rewrite.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/bundle/list.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/bundle/man.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/bundle/mcp-start.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/bundle/mcp.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/bundle/oas.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/bundle/openapi.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/bundle/remove.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/bundle/rename.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/bundle/restart.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/bundle/rm.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/bundle/start.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/bundle/status.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/bundle/stop.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/bundle/types.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/cache/arguments.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/cache/clear.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/cache/help.txt +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/cache/stats.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/connector/add.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/connector/arguments.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/connector/help.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/connector/help.txt +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/connector/infer.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/connector/list.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/connector/migrate.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/connector/models.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/connector/remove.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/connector/rm.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/connector/test.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/container/arguments.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/container/help.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/container/help.txt +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/container/man.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/container/ps.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/container/stop.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/controller/add.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/controller/arguments.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/controller/help.txt +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/controller/inc/args.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/controller/inc/namespace.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/controller/inc/reference-rewrite.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/controller/inc/reference-scan.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/controller/inc/scaffold.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/controller/remove.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/controller/rename.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/controller/rm.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/env/add.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/env/get.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/env/help.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/env/help.txt +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/env/link-dev.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/env/list.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/env/remove.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/env/rm.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/env/set.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/env/unset.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/env/use.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/framework/add.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/framework/arguments.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/framework/build.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/framework/dot.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/framework/get.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/framework/help.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/framework/help.txt +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/framework/link-node-modules.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/framework/link.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/framework/list.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/framework/man.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/framework/msg.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/framework/open.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/framework/remove.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/framework/reset.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/framework/restart.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/framework/set.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/framework/start.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/framework/status.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/framework/stop.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/framework/update.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/framework/version.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/gina-dev.1.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/gina-framework.1.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/helper.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/i18n/add.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/i18n/arguments.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/i18n/export.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/i18n/help.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/i18n/help.txt +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/i18n/import.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/i18n/scan.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/image/_host.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/image/arguments.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/image/build.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/image/help.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/image/help.txt +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/image/list.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/image/man.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/image/rm.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/image/run.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/index.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/inspector/help.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/inspector/help.txt +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/inspector/open.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/man-render.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/minion/arguments.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/minion/help.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/minion/help.txt +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/minion/kill.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/minion/list.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/msg.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/port/help.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/port/help.txt +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/port/inc/scan.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/port/list.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/port/reset.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/port/set.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/project/add.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/project/arguments.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/project/backup.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/project/build.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/project/help.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/project/help.txt +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/project/import.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/project/list.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/project/man.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/project/move.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/project/remove.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/project/rename.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/project/restart.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/project/restore.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/project/rm.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/project/start.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/project/status.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/project/stop.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/protocol/arguments.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/protocol/help.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/protocol/help.txt +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/protocol/list.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/protocol/remove.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/protocol/set.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/scope/add.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/scope/help.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/scope/help.txt +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/scope/link-local.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/scope/link-production.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/scope/list.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/scope/remove.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/scope/rm.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/scope/use.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/secrets/arguments.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/secrets/check.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/secrets/help.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/secrets/help.txt +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/secrets/scan.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/service/help.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/service/help.txt +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/service/list.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/service/man.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/service/start.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd/view/add.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd-status-format/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cmd-status-format/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/collection/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/collection/build.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/collection/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/collection/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/config.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/connector-config/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/connector-config/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/connector-error/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/connector-error/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/connector-registry/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/connector-registry/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cron/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cron/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/cron/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/domain/LICENSE +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/domain/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/domain/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/domain/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/dto/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/dto/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/dto-pipe/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/dto-pipe/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/dto-types/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/dto-types/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/generator/index.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/i18n/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/i18n/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/image-build/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/image-build/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/inherits/LICENSE +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/inherits/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/inherits/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/inherits/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/inspector-events/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/inspector-events/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/inspector-redact/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/inspector-redact/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/instrument/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/instrument/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/job/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/job/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/job-store.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/json-config-header/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/json-config-header/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/logger/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/logger/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/logger/src/containers/default/index.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/logger/src/containers/mq/index.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/logger/src/containers/mq/listener.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/logger/src/helper.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/logger/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/math/index.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/mcp-dispatch/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/mcp-dispatch/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/mcp-http/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/mcp-http/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/mcp-server/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/mcp-server/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/merge/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/merge/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/merge/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/metrics/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/metrics/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/model.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/nunjucks-filters/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/nunjucks-filters/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/nunjucks-resolver/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/nunjucks-resolver/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/proc.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/release-watch/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/release-watch/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/render-cache/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/render-cache/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/render-cache-store.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/routing/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/routing/build.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/routing/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/routing/src/radix.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/routing-introspect/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/routing-introspect/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/secrets/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/secrets/src/backends/env.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/secrets/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/session-store.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/shell.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/state.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/swig-filters/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/swig-filters/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/swig-resolver/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/swig-resolver/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/template-loaders/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/template-loaders/src/loaders/http.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/template-loaders/src/loaders/memory.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/template-loaders/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/url/README.md +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/url/index.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/url/routing.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/uuid/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/uuid/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/validator.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/watcher/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/watcher/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/ws-framing/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/ws-framing/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/ws-query/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/ws-query/src/main.js +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/ws-session/package.json +0 -0
- /package/framework/{v0.5.26 → v0.6.0}/lib/ws-session/src/main.js +0 -0
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of the gina package.
|
|
3
|
+
* Copyright (c) 2009-2026 Rhinostone <contact@gina.io>
|
|
4
|
+
*
|
|
5
|
+
* For the full copyright and license information, please view the LICENSE
|
|
6
|
+
* file that was distributed with this source code.
|
|
7
|
+
*/
|
|
8
|
+
'use strict';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* TOTP — time-based one-time passwords, RFC 6238 (#COMPLY3).
|
|
12
|
+
*
|
|
13
|
+
* The second factor, and the smallest of the three slices: TOTP is a short,
|
|
14
|
+
* fully-specified algorithm over HMAC, so gina implements it against the RFC
|
|
15
|
+
* rather than taking a dependency. Compatible with every standard authenticator
|
|
16
|
+
* (the `otpauth://` URI is the enrolment format they all read).
|
|
17
|
+
*
|
|
18
|
+
* What the bundle owns, because gina owns no user record:
|
|
19
|
+
*
|
|
20
|
+
* - **Storing the secret.** It is a credential: encrypt it at rest, and treat
|
|
21
|
+
* it like a password in every log and error path.
|
|
22
|
+
* - **Replay defence.** {@link verifyTotp} returns the step `counter` it
|
|
23
|
+
* matched; persist the accepted counter per user and refuse anything not
|
|
24
|
+
* strictly greater. Without that, a code stays valid for its whole window
|
|
25
|
+
* and an observer who sees it can reuse it. The RFC is explicit that this is
|
|
26
|
+
* the verifier's job, and gina cannot do it without a place to write.
|
|
27
|
+
* - **Recovery codes.** Deliberately not built: they are single-use random
|
|
28
|
+
* strings, so `hashPassword` + your own table already expresses them, and a
|
|
29
|
+
* half-owned implementation would be worse than none.
|
|
30
|
+
*
|
|
31
|
+
* @module lib/authn/totp
|
|
32
|
+
*
|
|
33
|
+
* @example <caption>Enrolment</caption>
|
|
34
|
+
* var secret = lib.authn.generateTotpSecret();
|
|
35
|
+
* var uri = lib.authn.otpauthURL({ secret: secret, account: user.email, issuer: 'Acme' });
|
|
36
|
+
* // render `uri` as a QR code; store `secret` encrypted once the user confirms a code
|
|
37
|
+
*
|
|
38
|
+
* @example <caption>Verification, with replay defence</caption>
|
|
39
|
+
* var res = lib.authn.verifyTotp(submitted, user.totpSecret);
|
|
40
|
+
* if (!res.valid) { return deny(); }
|
|
41
|
+
* if (res.counter <= user.totpLastCounter) { return deny(); } // replay
|
|
42
|
+
* user.totpLastCounter = res.counter;
|
|
43
|
+
*/
|
|
44
|
+
|
|
45
|
+
var crypto = require('crypto');
|
|
46
|
+
|
|
47
|
+
var BASE32_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';
|
|
48
|
+
|
|
49
|
+
/** @constant {number} Default secret length in bytes (160 bits — the RFC 4226 recommendation). @inner @private */
|
|
50
|
+
var DEFAULT_SECRET_BYTES = 20;
|
|
51
|
+
/** @constant {number} Default step length in seconds. @inner @private */
|
|
52
|
+
var DEFAULT_STEP = 30;
|
|
53
|
+
/** @constant {number} Default digits. @inner @private */
|
|
54
|
+
var DEFAULT_DIGITS = 6;
|
|
55
|
+
/** @constant {string} Default HMAC algorithm. @inner @private */
|
|
56
|
+
var DEFAULT_ALGORITHM = 'sha1';
|
|
57
|
+
/**
|
|
58
|
+
* Default acceptance window, in steps either side of now.
|
|
59
|
+
*
|
|
60
|
+
* One step (±30 s) absorbs ordinary clock drift between a phone and a server.
|
|
61
|
+
* Widening it linearly widens the interval an observed code stays usable, so it
|
|
62
|
+
* is a security parameter, not a convenience one.
|
|
63
|
+
*
|
|
64
|
+
* @constant
|
|
65
|
+
* @type {number}
|
|
66
|
+
* @inner
|
|
67
|
+
* @private
|
|
68
|
+
*/
|
|
69
|
+
var DEFAULT_WINDOW = 1;
|
|
70
|
+
|
|
71
|
+
var ALLOWED_ALGORITHMS = [ 'sha1', 'sha256', 'sha512' ];
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Hard ceiling on the acceptance window, in steps.
|
|
75
|
+
*
|
|
76
|
+
* Ten steps is already five minutes of tolerance either side at the default
|
|
77
|
+
* step — far past any real clock drift, and each step is an HMAC paid on the
|
|
78
|
+
* request path.
|
|
79
|
+
*
|
|
80
|
+
* @constant
|
|
81
|
+
* @type {number}
|
|
82
|
+
* @inner
|
|
83
|
+
* @private
|
|
84
|
+
*/
|
|
85
|
+
var MAX_WINDOW = 10;
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Encode bytes as RFC 4648 base32, unpadded.
|
|
89
|
+
*
|
|
90
|
+
* Unpadded because that is what authenticator apps expect in an `otpauth://`
|
|
91
|
+
* URI; {@link base32Decode} accepts padding on the way back in regardless.
|
|
92
|
+
*
|
|
93
|
+
* @param {Buffer} buf
|
|
94
|
+
* @returns {string}
|
|
95
|
+
* @inner
|
|
96
|
+
* @private
|
|
97
|
+
*/
|
|
98
|
+
function base32Encode(buf) {
|
|
99
|
+
var out = '';
|
|
100
|
+
var bits = 0;
|
|
101
|
+
var value = 0;
|
|
102
|
+
for (var i = 0; i < buf.length; i++) {
|
|
103
|
+
value = (value << 8) | buf[i];
|
|
104
|
+
bits += 8;
|
|
105
|
+
while (bits >= 5) {
|
|
106
|
+
out += BASE32_ALPHABET[(value >>> (bits - 5)) & 31];
|
|
107
|
+
bits -= 5;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (bits > 0) {
|
|
111
|
+
out += BASE32_ALPHABET[(value << (5 - bits)) & 31];
|
|
112
|
+
}
|
|
113
|
+
return out;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Decode RFC 4648 base32.
|
|
118
|
+
*
|
|
119
|
+
* Tolerant on input, because a user retyping a secret from a screen will use
|
|
120
|
+
* spaces and lowercase: padding, whitespace and case are all normalised. An
|
|
121
|
+
* out-of-alphabet character is an error, not a silent skip — a mistyped secret
|
|
122
|
+
* must fail loudly at enrolment rather than produce codes that never match.
|
|
123
|
+
*
|
|
124
|
+
* @param {string} str
|
|
125
|
+
* @returns {Buffer}
|
|
126
|
+
* @throws {Error} on a character outside the base32 alphabet.
|
|
127
|
+
* @inner
|
|
128
|
+
* @private
|
|
129
|
+
*/
|
|
130
|
+
function base32Decode(str) {
|
|
131
|
+
// The type guard is load-bearing, not defensive tidying: `String(null)` is
|
|
132
|
+
// "NULL", and N/U/L are all in the base32 alphabet — so a null secret
|
|
133
|
+
// decoded to a NON-EMPTY, GLOBALLY CONSTANT key, and the `key.length === 0`
|
|
134
|
+
// guard downstream never fired. Any account whose secret column was null
|
|
135
|
+
// was verifiable by anyone able to compute the code for that constant.
|
|
136
|
+
// Measured: verifyTotp(<code for "NULL">, null) returned {valid:true}.
|
|
137
|
+
if (typeof str !== 'string') {
|
|
138
|
+
throw new Error('[gina authn] TOTP secret must be a base32 string — got: ' + (str === null ? 'null' : typeof str));
|
|
139
|
+
}
|
|
140
|
+
var clean = String(str).toUpperCase().replace(/=+$/, '').replace(/\s+/g, '');
|
|
141
|
+
var bits = 0;
|
|
142
|
+
var value = 0;
|
|
143
|
+
var out = [];
|
|
144
|
+
for (var i = 0; i < clean.length; i++) {
|
|
145
|
+
var idx = BASE32_ALPHABET.indexOf(clean[i]);
|
|
146
|
+
if (idx === -1) {
|
|
147
|
+
throw new Error('[gina authn] TOTP secret is not valid base32 — unexpected character: ' + JSON.stringify(clean[i]));
|
|
148
|
+
}
|
|
149
|
+
value = (value << 5) | idx;
|
|
150
|
+
bits += 5;
|
|
151
|
+
if (bits >= 8) {
|
|
152
|
+
out.push((value >>> (bits - 8)) & 255);
|
|
153
|
+
bits -= 8;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return Buffer.from(out);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Generate a TOTP secret.
|
|
161
|
+
*
|
|
162
|
+
* @param {number} [bytes=20] - entropy in bytes; 20 is the RFC 4226 recommendation.
|
|
163
|
+
* @returns {string} base32, unpadded — the form an authenticator expects.
|
|
164
|
+
* @throws {Error} when `bytes` is not a positive integer, or below 16.
|
|
165
|
+
* @memberof module:lib/authn
|
|
166
|
+
*
|
|
167
|
+
* @example
|
|
168
|
+
* var secret = lib.authn.generateTotpSecret(); // 'JBSWY3DPEHPK3PXP...'
|
|
169
|
+
*/
|
|
170
|
+
function generateTotpSecret(bytes) {
|
|
171
|
+
var n = (typeof bytes === 'undefined') ? DEFAULT_SECRET_BYTES : bytes;
|
|
172
|
+
if (typeof n !== 'number' || !isFinite(n) || Math.floor(n) !== n || n < 16) {
|
|
173
|
+
throw new Error('[gina authn] generateTotpSecret(bytes): expects a whole number >= 16 (128 bits) — got: ' + JSON.stringify(bytes));
|
|
174
|
+
}
|
|
175
|
+
return base32Encode(crypto.randomBytes(n));
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Compute the HOTP value for one counter (RFC 4226 §5.3).
|
|
180
|
+
*
|
|
181
|
+
* @param {Buffer} key
|
|
182
|
+
* @param {number} counter
|
|
183
|
+
* @param {string} algorithm
|
|
184
|
+
* @param {number} digits
|
|
185
|
+
* @returns {string} zero-padded to `digits`.
|
|
186
|
+
* @inner
|
|
187
|
+
* @private
|
|
188
|
+
*/
|
|
189
|
+
function hotp(key, counter, algorithm, digits) {
|
|
190
|
+
var buf = Buffer.alloc(8);
|
|
191
|
+
// A 64-bit counter written as two 32-bit halves. At 30-second steps the high
|
|
192
|
+
// half stays zero until epoch second 128849018880 — the year 6053 — but the
|
|
193
|
+
// RFC specifies eight bytes and an authenticator hashes all eight.
|
|
194
|
+
buf.writeUInt32BE(Math.floor(counter / 0x100000000), 0);
|
|
195
|
+
buf.writeUInt32BE(counter >>> 0, 4);
|
|
196
|
+
|
|
197
|
+
var digest = crypto.createHmac(algorithm, key).update(buf).digest();
|
|
198
|
+
var offset = digest[digest.length - 1] & 0x0f;
|
|
199
|
+
var binary = ((digest[offset] & 0x7f) << 24)
|
|
200
|
+
| ((digest[offset + 1] & 0xff) << 16)
|
|
201
|
+
| ((digest[offset + 2] & 0xff) << 8)
|
|
202
|
+
| (digest[offset + 3] & 0xff);
|
|
203
|
+
|
|
204
|
+
var code = (binary % Math.pow(10, digits)).toString();
|
|
205
|
+
while (code.length < digits) {
|
|
206
|
+
code = '0' + code;
|
|
207
|
+
}
|
|
208
|
+
return code;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Normalise and validate the shared option set.
|
|
213
|
+
*
|
|
214
|
+
* @param {object} [options]
|
|
215
|
+
* @returns {{step: number, digits: number, algorithm: string, window: number}}
|
|
216
|
+
* @throws {Error} on an unsupported value.
|
|
217
|
+
* @inner
|
|
218
|
+
* @private
|
|
219
|
+
*/
|
|
220
|
+
function resolveOptions(options) {
|
|
221
|
+
options = options || {};
|
|
222
|
+
var step = (typeof options.step === 'undefined') ? DEFAULT_STEP : options.step;
|
|
223
|
+
var digits = (typeof options.digits === 'undefined') ? DEFAULT_DIGITS : options.digits;
|
|
224
|
+
var algorithm = (typeof options.algorithm === 'undefined') ? DEFAULT_ALGORITHM : String(options.algorithm).toLowerCase();
|
|
225
|
+
var window_ = (typeof options.window === 'undefined') ? DEFAULT_WINDOW : options.window;
|
|
226
|
+
|
|
227
|
+
if (typeof step !== 'number' || !isFinite(step) || step <= 0 || Math.floor(step) !== step) {
|
|
228
|
+
throw new Error('[gina authn] TOTP `step` must be a positive whole number of seconds — got: ' + JSON.stringify(options.step));
|
|
229
|
+
}
|
|
230
|
+
if (typeof digits !== 'number' || digits < 6 || digits > 10 || Math.floor(digits) !== digits) {
|
|
231
|
+
throw new Error('[gina authn] TOTP `digits` must be a whole number in 6..10 — got: ' + JSON.stringify(options.digits));
|
|
232
|
+
}
|
|
233
|
+
if (ALLOWED_ALGORITHMS.indexOf(algorithm) === -1) {
|
|
234
|
+
throw new Error('[gina authn] TOTP `algorithm` must be one of ' + ALLOWED_ALGORITHMS.join(', ') + ' — got: ' + JSON.stringify(options.algorithm));
|
|
235
|
+
}
|
|
236
|
+
if (typeof window_ !== 'number' || !isFinite(window_) || window_ < 0 || Math.floor(window_) !== window_ || window_ > MAX_WINDOW) {
|
|
237
|
+
// Upper-bounded because each step costs an HMAC on the request path and
|
|
238
|
+
// every extra step widens the interval an observed code stays usable.
|
|
239
|
+
// Measured unbounded: window 100000 blocked the event loop for ~79 ms.
|
|
240
|
+
throw new Error('[gina authn] TOTP `window` must be a whole number in 0..' + MAX_WINDOW + ' — got: ' + JSON.stringify(options.window));
|
|
241
|
+
}
|
|
242
|
+
return { step: step, digits: digits, algorithm: algorithm, window: window_ };
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Generate the TOTP code for a moment in time.
|
|
247
|
+
*
|
|
248
|
+
* Mostly useful for enrolment confirmation and for tests; a server rarely needs
|
|
249
|
+
* to produce a code it is about to compare.
|
|
250
|
+
*
|
|
251
|
+
* @param {string} secret - base32, as returned by {@link generateTotpSecret}.
|
|
252
|
+
* @param {object} [options]
|
|
253
|
+
* @param {number} [options.at] - epoch MILLISECONDS; defaults to now.
|
|
254
|
+
* @param {number} [options.step=30] - step length in seconds.
|
|
255
|
+
* @param {number} [options.digits=6]
|
|
256
|
+
* @param {string} [options.algorithm=sha1] - `sha1` | `sha256` | `sha512`.
|
|
257
|
+
* @returns {string} the zero-padded code.
|
|
258
|
+
* @throws {Error} on an invalid secret or option.
|
|
259
|
+
* @memberof module:lib/authn
|
|
260
|
+
*
|
|
261
|
+
* @example
|
|
262
|
+
* lib.authn.generateTotp(secret); // code for right now
|
|
263
|
+
* lib.authn.generateTotp(secret, { at: 59000 }); // RFC 6238 test vector time
|
|
264
|
+
*/
|
|
265
|
+
function generateTotp(secret, options) {
|
|
266
|
+
var opts = resolveOptions(options);
|
|
267
|
+
var key = base32Decode(secret);
|
|
268
|
+
if (key.length === 0) {
|
|
269
|
+
throw new Error('[gina authn] TOTP secret is empty');
|
|
270
|
+
}
|
|
271
|
+
var at = (options && typeof options.at === 'number') ? options.at : Date.now();
|
|
272
|
+
var counter = Math.floor((at / 1000) / opts.step);
|
|
273
|
+
return hotp(key, counter, opts.algorithm, opts.digits);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Verify a submitted TOTP code.
|
|
278
|
+
*
|
|
279
|
+
* Checks the current step and `window` steps either side, comparing in constant
|
|
280
|
+
* time. Returns the matched step as an absolute `counter` — **persist it and
|
|
281
|
+
* require the next accepted counter to be strictly greater**, or a code remains
|
|
282
|
+
* reusable for its whole acceptance window.
|
|
283
|
+
*
|
|
284
|
+
* Never throws for a bad code: a malformed submission is `{valid: false}`, the
|
|
285
|
+
* same shape as a wrong one, so an attacker learns nothing from the difference.
|
|
286
|
+
* An invalid SECRET does throw — that is a configuration fault, not a login
|
|
287
|
+
* attempt.
|
|
288
|
+
*
|
|
289
|
+
* @param {string} token - the submitted code.
|
|
290
|
+
* @param {string} secret - base32 shared secret.
|
|
291
|
+
* @param {object} [options]
|
|
292
|
+
* @param {number} [options.at] - epoch MILLISECONDS; defaults to now.
|
|
293
|
+
* @param {number} [options.window=1] - steps of tolerance either side.
|
|
294
|
+
* @param {number} [options.step=30]
|
|
295
|
+
* @param {number} [options.digits=6]
|
|
296
|
+
* @param {string} [options.algorithm=sha1]
|
|
297
|
+
* @returns {{valid: boolean, counter: ?number}} `counter` is the absolute step counter that matched — an index, not an offset from now — or `null`.
|
|
298
|
+
* @throws {Error} when the secret is unusable.
|
|
299
|
+
* @memberof module:lib/authn
|
|
300
|
+
*
|
|
301
|
+
* @example
|
|
302
|
+
* var res = lib.authn.verifyTotp(self.post.code, user.totpSecret);
|
|
303
|
+
* if (!res.valid || res.counter <= user.totpLastCounter) { return deny(); }
|
|
304
|
+
* user.totpLastCounter = res.counter;
|
|
305
|
+
*/
|
|
306
|
+
function verifyTotp(token, secret, options) {
|
|
307
|
+
var opts = resolveOptions(options);
|
|
308
|
+
var key = base32Decode(secret);
|
|
309
|
+
if (key.length === 0) {
|
|
310
|
+
throw new Error('[gina authn] TOTP secret is empty');
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
if (typeof token !== 'string' && typeof token !== 'number') {
|
|
314
|
+
return { valid: false, counter: null };
|
|
315
|
+
}
|
|
316
|
+
var submitted = String(token).replace(/\s+/g, '');
|
|
317
|
+
// A numeric submission has already lost any leading zero — `Number('012345')`
|
|
318
|
+
// is 12345 — so re-pad before the length check. Measured without this: 9.6%
|
|
319
|
+
// of genuine codes were rejected, exactly the ones beginning with 0. It fails
|
|
320
|
+
// CLOSED, so it was never a bypass; it is the intermittent kind of breakage
|
|
321
|
+
// that is expensive to diagnose in the field.
|
|
322
|
+
if (typeof token === 'number' && /^[0-9]+$/.test(submitted)) {
|
|
323
|
+
while (submitted.length < opts.digits) {
|
|
324
|
+
submitted = '0' + submitted;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
if (!/^[0-9]+$/.test(submitted) || submitted.length !== opts.digits) {
|
|
328
|
+
return { valid: false, counter: null };
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
var at = (options && typeof options.at === 'number') ? options.at : Date.now();
|
|
332
|
+
var counter = Math.floor((at / 1000) / opts.step);
|
|
333
|
+
var submittedBuf = Buffer.from(submitted, 'utf8');
|
|
334
|
+
|
|
335
|
+
for (var i = -opts.window; i <= opts.window; i++) {
|
|
336
|
+
// A counter before the epoch has no meaning and would make hotp's
|
|
337
|
+
// writeUInt32BE throw a RangeError — which would break the "never
|
|
338
|
+
// throws for a bad code" contract for any `at` under one step.
|
|
339
|
+
if (counter + i < 0) {
|
|
340
|
+
continue;
|
|
341
|
+
}
|
|
342
|
+
var candidate = hotp(key, counter + i, opts.algorithm, opts.digits);
|
|
343
|
+
var candidateBuf = Buffer.from(candidate, 'utf8');
|
|
344
|
+
// Lengths are equal by construction (both zero-padded to `digits`, and
|
|
345
|
+
// the submission was length-checked above), so this cannot throw.
|
|
346
|
+
var match = false;
|
|
347
|
+
try {
|
|
348
|
+
match = crypto.timingSafeEqual(submittedBuf, candidateBuf);
|
|
349
|
+
} catch (e) {
|
|
350
|
+
match = false;
|
|
351
|
+
}
|
|
352
|
+
if (match) {
|
|
353
|
+
return { valid: true, counter: counter + i };
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
return { valid: false, counter: null };
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/**
|
|
360
|
+
* Build the `otpauth://` enrolment URI an authenticator app scans.
|
|
361
|
+
*
|
|
362
|
+
* Follows the de-facto Key Uri Format: the label carries `Issuer:Account` and
|
|
363
|
+
* the `issuer` parameter repeats it, which is what makes apps display the
|
|
364
|
+
* account under the right name.
|
|
365
|
+
*
|
|
366
|
+
* @param {object} params
|
|
367
|
+
* @param {string} params.secret - base32 secret.
|
|
368
|
+
* @param {string} params.account - the user-visible account name (an email, usually).
|
|
369
|
+
* @param {string} [params.issuer] - your application's name.
|
|
370
|
+
* @param {number} [params.digits=6]
|
|
371
|
+
* @param {number} [params.step=30]
|
|
372
|
+
* @param {string} [params.algorithm=sha1]
|
|
373
|
+
* @returns {string} the `otpauth://totp/...` URI.
|
|
374
|
+
* @throws {Error} when `secret` or `account` is missing.
|
|
375
|
+
* @memberof module:lib/authn
|
|
376
|
+
*
|
|
377
|
+
* @example
|
|
378
|
+
* lib.authn.otpauthURL({ secret: s, account: 'ada@example.com', issuer: 'Acme' });
|
|
379
|
+
* // otpauth://totp/Acme:ada%40example.com?secret=...&issuer=Acme&algorithm=SHA1&digits=6&period=30
|
|
380
|
+
*/
|
|
381
|
+
function otpauthURL(params) {
|
|
382
|
+
params = params || {};
|
|
383
|
+
if (typeof params.secret !== 'string' || params.secret.length === 0) {
|
|
384
|
+
throw new Error('[gina authn] otpauthURL requires a `secret`');
|
|
385
|
+
}
|
|
386
|
+
if (typeof params.account !== 'string' || params.account.length === 0) {
|
|
387
|
+
throw new Error('[gina authn] otpauthURL requires an `account` (the user-visible name shown in the authenticator)');
|
|
388
|
+
}
|
|
389
|
+
// Validate the secret HERE rather than let a QR code carry something the
|
|
390
|
+
// authenticator will happily accept and the server can never verify.
|
|
391
|
+
base32Decode(params.secret);
|
|
392
|
+
var opts = resolveOptions(params);
|
|
393
|
+
|
|
394
|
+
var label = params.issuer
|
|
395
|
+
? encodeURIComponent(params.issuer) + ':' + encodeURIComponent(params.account)
|
|
396
|
+
: encodeURIComponent(params.account);
|
|
397
|
+
|
|
398
|
+
var query = 'secret=' + encodeURIComponent(params.secret);
|
|
399
|
+
if (params.issuer) {
|
|
400
|
+
query += '&issuer=' + encodeURIComponent(params.issuer);
|
|
401
|
+
}
|
|
402
|
+
query += '&algorithm=' + opts.algorithm.toUpperCase();
|
|
403
|
+
query += '&digits=' + opts.digits;
|
|
404
|
+
query += '&period=' + opts.step;
|
|
405
|
+
|
|
406
|
+
return 'otpauth://totp/' + label + '?' + query;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
module.exports = {
|
|
410
|
+
generateTotpSecret : generateTotpSecret,
|
|
411
|
+
generateTotp : generateTotp,
|
|
412
|
+
verifyTotp : verifyTotp,
|
|
413
|
+
otpauthURL : otpauthURL,
|
|
414
|
+
// test seams — may change without notice
|
|
415
|
+
_base32Encode : base32Encode,
|
|
416
|
+
_base32Decode : base32Decode,
|
|
417
|
+
_hotp : hotp
|
|
418
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
Usage: gina audit:<command> [<bundle>] [@<project>] [OPTIONS]
|
|
2
|
+
|
|
3
|
+
Audit-trail commands (#COMPLY2). The trail itself is written by the running
|
|
4
|
+
bundle (settings.json > audit); these commands inspect it offline.
|
|
5
|
+
|
|
6
|
+
Commands:
|
|
7
|
+
|
|
8
|
+
audit:verify <bundle> @<project> Verify the tamper-evidence hash chain
|
|
9
|
+
of the bundle's audit trail: every
|
|
10
|
+
record's `hash` is recomputed
|
|
11
|
+
(HMAC-SHA256 over the canonical record
|
|
12
|
+
+ the previous hash) and the FIRST
|
|
13
|
+
break is reported with line + reason.
|
|
14
|
+
|
|
15
|
+
Options:
|
|
16
|
+
|
|
17
|
+
--env=<env> Environment of the trail to verify
|
|
18
|
+
(default: the project default env).
|
|
19
|
+
Selects the default trail filename
|
|
20
|
+
<project>/logs/audit-<bundle>-<env>.jsonl
|
|
21
|
+
--file=</abs/path> Verify this exact file instead of
|
|
22
|
+
deriving the path from settings.json
|
|
23
|
+
--format=json Machine-readable report:
|
|
24
|
+
{ok, records, unchained, breakAt,
|
|
25
|
+
warnings, file}
|
|
26
|
+
|
|
27
|
+
Signing key resolution (first match wins):
|
|
28
|
+
1. settings.json > audit.chain.secret — a literal, or `${secret:VAR}`
|
|
29
|
+
resolved from the shell environment (VAR must NOT be GINA_-prefixed:
|
|
30
|
+
the CLI sweeps GINA_* out of process.env before handlers run).
|
|
31
|
+
2. GINA_AUDIT_SECRET (read through the framework environment reader).
|
|
32
|
+
|
|
33
|
+
Exit codes:
|
|
34
|
+
0 chain intact (warnings, if any, are printed — read them)
|
|
35
|
+
1 chain BROKEN (first break reported)
|
|
36
|
+
2 usage / configuration error (no trail file, no signing key, bad --env)
|
|
37
|
+
|
|
38
|
+
What an intact chain proves — and what it does not:
|
|
39
|
+
Detects post-hoc edit, deletion, insertion and reordering by anyone WITHOUT
|
|
40
|
+
the signing key. It cannot see truncation at the exact tail (nothing after
|
|
41
|
+
it commits to it), it verifies an empty trail trivially (read the record
|
|
42
|
+
count), and the process holding the key can forge a whole chain — stream
|
|
43
|
+
the trail to WORM storage (see the compliance guide) for that adversary.
|
|
44
|
+
|
|
45
|
+
Examples:
|
|
46
|
+
|
|
47
|
+
gina audit:verify web @myproject
|
|
48
|
+
gina audit:verify web @myproject --env=prod
|
|
49
|
+
gina audit:verify web @myproject --file=/var/log/audit-web-prod.jsonl
|
|
50
|
+
gina audit:verify web @myproject --format=json
|