@budibase/backend-core 2.9.39-alpha.0 → 2.9.39-alpha.2
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/dist/package.json +5 -5
- package/dist/src/accounts/accounts.js +100 -0
- package/dist/src/accounts/accounts.js.map +7 -0
- package/dist/src/accounts/api.js +78 -0
- package/dist/src/accounts/api.js.map +7 -0
- package/dist/src/accounts/index.js +23 -0
- package/dist/src/accounts/index.js.map +7 -0
- package/dist/src/auth/auth.js +208 -0
- package/dist/src/auth/auth.js.map +7 -0
- package/dist/src/auth/index.js +23 -0
- package/dist/src/auth/index.js.map +7 -0
- package/dist/src/auth/tests/auth.spec.js +37 -0
- package/dist/src/auth/tests/auth.spec.js.map +7 -0
- package/dist/src/blacklist/blacklist.js +88 -0
- package/dist/src/blacklist/blacklist.js.map +7 -0
- package/dist/src/blacklist/index.js +23 -0
- package/dist/src/blacklist/index.js.map +7 -0
- package/dist/src/blacklist/tests/blacklist.spec.js +61 -0
- package/dist/src/blacklist/tests/blacklist.spec.js.map +7 -0
- package/dist/src/cache/appMetadata.js +86 -0
- package/dist/src/cache/appMetadata.js.map +7 -0
- package/dist/src/cache/base/index.js +102 -0
- package/dist/src/cache/base/index.js.map +7 -0
- package/dist/src/cache/generic.js +69 -0
- package/dist/src/cache/generic.js.map +7 -0
- package/dist/src/cache/index.js +51 -0
- package/dist/src/cache/index.js.map +7 -0
- package/dist/src/cache/tests/writethrough.spec.js +132 -0
- package/dist/src/cache/tests/writethrough.spec.js.map +7 -0
- package/dist/src/cache/user.js +99 -0
- package/dist/src/cache/user.js.map +7 -0
- package/dist/src/cache/writethrough.js +144 -0
- package/dist/src/cache/writethrough.js.map +7 -0
- package/dist/src/configs/configs.js +228 -0
- package/dist/src/configs/configs.js.map +7 -0
- package/dist/src/configs/index.js +23 -0
- package/dist/src/configs/index.js.map +7 -0
- package/dist/src/configs/tests/configs.spec.js +182 -0
- package/dist/src/configs/tests/configs.spec.js.map +7 -0
- package/dist/src/constants/db.js +107 -0
- package/dist/src/constants/db.js.map +7 -0
- package/dist/src/constants/index.js +25 -0
- package/dist/src/constants/index.js.map +7 -0
- package/dist/src/constants/misc.js +92 -0
- package/dist/src/constants/misc.js.map +7 -0
- package/dist/src/context/Context.js +36 -0
- package/dist/src/context/Context.js.map +7 -0
- package/dist/src/context/identity.js +87 -0
- package/dist/src/context/identity.js.map +7 -0
- package/dist/src/context/index.js +45 -0
- package/dist/src/context/index.js.map +7 -0
- package/dist/src/context/mainContext.js +320 -0
- package/dist/src/context/mainContext.js.map +7 -0
- package/dist/src/context/tests/index.spec.js +147 -0
- package/dist/src/context/tests/index.spec.js.map +7 -0
- package/dist/src/context/types.js +17 -0
- package/dist/src/context/types.js.map +7 -0
- package/dist/src/db/Replication.js +89 -0
- package/dist/src/db/Replication.js.map +7 -0
- package/dist/src/db/constants.js +39 -0
- package/dist/src/db/constants.js.map +7 -0
- package/dist/src/db/couch/DatabaseImpl.js +224 -0
- package/dist/src/db/couch/DatabaseImpl.js.map +7 -0
- package/dist/src/db/couch/connections.js +103 -0
- package/dist/src/db/couch/connections.js.map +7 -0
- package/dist/src/db/couch/index.js +44 -0
- package/dist/src/db/couch/index.js.map +7 -0
- package/dist/src/db/couch/pouchDB.js +118 -0
- package/dist/src/db/couch/pouchDB.js.map +7 -0
- package/dist/src/db/couch/pouchDump.js +2 -0
- package/dist/src/db/couch/pouchDump.js.map +7 -0
- package/dist/src/db/couch/utils.js +76 -0
- package/dist/src/db/couch/utils.js.map +7 -0
- package/dist/src/db/db.js +73 -0
- package/dist/src/db/db.js.map +7 -0
- package/dist/src/db/errors.js +43 -0
- package/dist/src/db/errors.js.map +7 -0
- package/dist/src/db/index.js +64 -0
- package/dist/src/db/index.js.map +7 -0
- package/dist/src/db/lucene.js +595 -0
- package/dist/src/db/lucene.js.map +7 -0
- package/dist/src/db/searchIndexes/index.js +23 -0
- package/dist/src/db/searchIndexes/index.js.map +7 -0
- package/dist/src/db/searchIndexes/searchIndexes.js +82 -0
- package/dist/src/db/searchIndexes/searchIndexes.js.map +7 -0
- package/dist/src/db/tests/index.spec.js +24 -0
- package/dist/src/db/tests/index.spec.js.map +7 -0
- package/dist/src/db/tests/lucene.spec.js +312 -0
- package/dist/src/db/tests/lucene.spec.js.map +7 -0
- package/dist/src/db/tests/pouch.spec.js +63 -0
- package/dist/src/db/tests/pouch.spec.js.map +7 -0
- package/dist/src/db/tests/utils.spec.js +50 -0
- package/dist/src/db/tests/utils.spec.js.map +7 -0
- package/dist/src/db/utils.js +198 -0
- package/dist/src/db/utils.js.map +7 -0
- package/dist/src/db/views.js +223 -0
- package/dist/src/db/views.js.map +7 -0
- package/dist/src/docIds/conversions.js +83 -0
- package/dist/src/docIds/conversions.js.map +7 -0
- package/dist/src/docIds/ids.js +101 -0
- package/dist/src/docIds/ids.js.map +7 -0
- package/dist/src/docIds/index.js +25 -0
- package/dist/src/docIds/index.js.map +7 -0
- package/dist/src/docIds/newid.js +32 -0
- package/dist/src/docIds/newid.js.map +7 -0
- package/dist/src/docIds/params.js +136 -0
- package/dist/src/docIds/params.js.map +7 -0
- package/dist/src/docUpdates/index.js +61 -0
- package/dist/src/docUpdates/index.js.map +7 -0
- package/dist/src/environment.js +181 -0
- package/dist/src/environment.js.map +7 -0
- package/dist/src/errors/errors.js +126 -0
- package/dist/src/errors/errors.js.map +7 -0
- package/dist/src/errors/index.js +23 -0
- package/dist/src/errors/index.js.map +7 -0
- package/dist/src/events/analytics.js +42 -0
- package/dist/src/events/analytics.js.map +7 -0
- package/dist/src/events/asyncEvents/index.js +25 -0
- package/dist/src/events/asyncEvents/index.js.map +7 -0
- package/dist/src/events/asyncEvents/publisher.js +39 -0
- package/dist/src/events/asyncEvents/publisher.js.map +7 -0
- package/dist/src/events/asyncEvents/queue.js +42 -0
- package/dist/src/events/asyncEvents/queue.js.map +7 -0
- package/dist/src/events/backfill.js +172 -0
- package/dist/src/events/backfill.js.map +7 -0
- package/dist/src/events/documentId.js +51 -0
- package/dist/src/events/documentId.js.map +7 -0
- package/dist/src/events/events.js +63 -0
- package/dist/src/events/events.js.map +7 -0
- package/dist/src/events/identification.js +275 -0
- package/dist/src/events/identification.js.map +7 -0
- package/dist/src/events/index.js +62 -0
- package/dist/src/events/index.js.map +7 -0
- package/dist/src/events/processors/AnalyticsProcessor.js +76 -0
- package/dist/src/events/processors/AnalyticsProcessor.js.map +7 -0
- package/dist/src/events/processors/AuditLogsProcessor.js +97 -0
- package/dist/src/events/processors/AuditLogsProcessor.js.map +7 -0
- package/dist/src/events/processors/LoggingProcessor.js +58 -0
- package/dist/src/events/processors/LoggingProcessor.js.map +7 -0
- package/dist/src/events/processors/Processors.js +57 -0
- package/dist/src/events/processors/Processors.js.map +7 -0
- package/dist/src/events/processors/async/DocumentUpdateProcessor.js +53 -0
- package/dist/src/events/processors/async/DocumentUpdateProcessor.js.map +7 -0
- package/dist/src/events/processors/index.js +57 -0
- package/dist/src/events/processors/index.js.map +7 -0
- package/dist/src/events/processors/posthog/PosthogProcessor.js +126 -0
- package/dist/src/events/processors/posthog/PosthogProcessor.js.map +7 -0
- package/dist/src/events/processors/posthog/index.js +36 -0
- package/dist/src/events/processors/posthog/index.js.map +7 -0
- package/dist/src/events/processors/posthog/rateLimiting.js +105 -0
- package/dist/src/events/processors/posthog/rateLimiting.js.map +7 -0
- package/dist/src/events/processors/posthog/tests/PosthogProcessor.spec.js +154 -0
- package/dist/src/events/processors/posthog/tests/PosthogProcessor.spec.js.map +7 -0
- package/dist/src/events/processors/types.js +29 -0
- package/dist/src/events/processors/types.js.map +7 -0
- package/dist/src/events/publishers/account.js +49 -0
- package/dist/src/events/publishers/account.js.map +7 -0
- package/dist/src/events/publishers/app.js +145 -0
- package/dist/src/events/publishers/app.js.map +7 -0
- package/dist/src/events/publishers/auditLog.js +42 -0
- package/dist/src/events/publishers/auditLog.js.map +7 -0
- package/dist/src/events/publishers/auth.js +80 -0
- package/dist/src/events/publishers/auth.js.map +7 -0
- package/dist/src/events/publishers/automation.js +111 -0
- package/dist/src/events/publishers/automation.js.map +7 -0
- package/dist/src/events/publishers/backfill.js +92 -0
- package/dist/src/events/publishers/backfill.js.map +7 -0
- package/dist/src/events/publishers/backup.js +49 -0
- package/dist/src/events/publishers/backup.js.map +7 -0
- package/dist/src/events/publishers/datasource.js +59 -0
- package/dist/src/events/publishers/datasource.js.map +7 -0
- package/dist/src/events/publishers/email.js +38 -0
- package/dist/src/events/publishers/email.js.map +7 -0
- package/dist/src/events/publishers/environmentVariable.js +53 -0
- package/dist/src/events/publishers/environmentVariable.js.map +7 -0
- package/dist/src/events/publishers/group.js +105 -0
- package/dist/src/events/publishers/group.js.map +7 -0
- package/dist/src/events/publishers/index.js +108 -0
- package/dist/src/events/publishers/index.js.map +7 -0
- package/dist/src/events/publishers/installation.js +56 -0
- package/dist/src/events/publishers/installation.js.map +7 -0
- package/dist/src/events/publishers/layout.js +42 -0
- package/dist/src/events/publishers/layout.js.map +7 -0
- package/dist/src/events/publishers/license.js +78 -0
- package/dist/src/events/publishers/license.js.map +7 -0
- package/dist/src/events/publishers/org.js +53 -0
- package/dist/src/events/publishers/org.js.map +7 -0
- package/dist/src/events/publishers/plugin.js +61 -0
- package/dist/src/events/publishers/plugin.js.map +7 -0
- package/dist/src/events/publishers/query.js +85 -0
- package/dist/src/events/publishers/query.js.map +7 -0
- package/dist/src/events/publishers/role.js +71 -0
- package/dist/src/events/publishers/role.js.map +7 -0
- package/dist/src/events/publishers/rows.js +43 -0
- package/dist/src/events/publishers/rows.js.map +7 -0
- package/dist/src/events/publishers/screen.js +52 -0
- package/dist/src/events/publishers/screen.js.map +7 -0
- package/dist/src/events/publishers/serve.js +53 -0
- package/dist/src/events/publishers/serve.js.map +7 -0
- package/dist/src/events/publishers/table.js +79 -0
- package/dist/src/events/publishers/table.js.map +7 -0
- package/dist/src/events/publishers/user.js +191 -0
- package/dist/src/events/publishers/user.js.map +7 -0
- package/dist/src/events/publishers/view.js +102 -0
- package/dist/src/events/publishers/view.js.map +7 -0
- package/dist/src/features/index.js +105 -0
- package/dist/src/features/index.js.map +7 -0
- package/dist/src/features/installation.js +42 -0
- package/dist/src/features/installation.js.map +7 -0
- package/dist/src/features/tests/featureFlags.spec.js +86 -0
- package/dist/src/features/tests/featureFlags.spec.js.map +7 -0
- package/dist/src/helpers.js +31 -0
- package/dist/src/helpers.js.map +7 -0
- package/dist/src/index.js +154 -0
- package/dist/src/index.js.map +7 -0
- package/dist/src/installation.js +139 -0
- package/dist/src/installation.js.map +7 -0
- package/dist/src/logging/alerts.js +49 -0
- package/dist/src/logging/alerts.js.map +7 -0
- package/dist/src/logging/correlation/correlation.js +41 -0
- package/dist/src/logging/correlation/correlation.js.map +7 -0
- package/dist/src/logging/correlation/index.js +23 -0
- package/dist/src/logging/correlation/index.js.map +7 -0
- package/dist/src/logging/correlation/middleware.js +37 -0
- package/dist/src/logging/correlation/middleware.js.map +7 -0
- package/dist/src/logging/index.js +48 -0
- package/dist/src/logging/index.js.map +7 -0
- package/dist/src/logging/pino/logger.js +197 -0
- package/dist/src/logging/pino/logger.js.map +7 -0
- package/dist/src/logging/pino/middleware.js +77 -0
- package/dist/src/logging/pino/middleware.js.map +7 -0
- package/dist/src/logging/system.js +110 -0
- package/dist/src/logging/system.js.map +7 -0
- package/dist/src/logging/tests/system.spec.js +59 -0
- package/dist/src/logging/tests/system.spec.js.map +7 -0
- package/dist/src/middleware/adminOnly.js +31 -0
- package/dist/src/middleware/adminOnly.js.map +7 -0
- package/dist/src/middleware/auditLog.js +27 -0
- package/dist/src/middleware/auditLog.js.map +7 -0
- package/dist/src/middleware/authenticated.js +178 -0
- package/dist/src/middleware/authenticated.js.map +7 -0
- package/dist/src/middleware/builderOnly.js +48 -0
- package/dist/src/middleware/builderOnly.js.map +7 -0
- package/dist/src/middleware/builderOrAdmin.js +48 -0
- package/dist/src/middleware/builderOrAdmin.js.map +7 -0
- package/dist/src/middleware/csrf.js +60 -0
- package/dist/src/middleware/csrf.js.map +7 -0
- package/dist/src/middleware/errorHandling.js +62 -0
- package/dist/src/middleware/errorHandling.js.map +7 -0
- package/dist/src/middleware/index.js +95 -0
- package/dist/src/middleware/index.js.map +7 -0
- package/dist/src/middleware/internalApi.js +39 -0
- package/dist/src/middleware/internalApi.js.map +7 -0
- package/dist/src/middleware/joi-validator.js +73 -0
- package/dist/src/middleware/joi-validator.js.map +7 -0
- package/dist/src/middleware/matchers.js +62 -0
- package/dist/src/middleware/matchers.js.map +7 -0
- package/dist/src/middleware/passport/datasource/google.js +103 -0
- package/dist/src/middleware/passport/datasource/google.js.map +7 -0
- package/dist/src/middleware/passport/local.js +73 -0
- package/dist/src/middleware/passport/local.js.map +7 -0
- package/dist/src/middleware/passport/sso/google.js +93 -0
- package/dist/src/middleware/passport/sso/google.js.map +7 -0
- package/dist/src/middleware/passport/sso/oidc.js +135 -0
- package/dist/src/middleware/passport/sso/oidc.js.map +7 -0
- package/dist/src/middleware/passport/sso/sso.js +149 -0
- package/dist/src/middleware/passport/sso/sso.js.map +7 -0
- package/dist/src/middleware/passport/sso/tests/google.spec.js +77 -0
- package/dist/src/middleware/passport/sso/tests/google.spec.js.map +7 -0
- package/dist/src/middleware/passport/sso/tests/oidc.spec.js +143 -0
- package/dist/src/middleware/passport/sso/tests/oidc.spec.js.map +7 -0
- package/dist/src/middleware/passport/sso/tests/sso.spec.js +167 -0
- package/dist/src/middleware/passport/sso/tests/sso.spec.js.map +7 -0
- package/dist/src/middleware/passport/utils.js +62 -0
- package/dist/src/middleware/passport/utils.js.map +7 -0
- package/dist/src/middleware/querystringToBody.js +45 -0
- package/dist/src/middleware/querystringToBody.js.map +7 -0
- package/dist/src/middleware/tenancy.js +46 -0
- package/dist/src/middleware/tenancy.js.map +7 -0
- package/dist/src/middleware/tests/builder.spec.js +169 -0
- package/dist/src/middleware/tests/builder.spec.js.map +7 -0
- package/dist/src/middleware/tests/matchers.spec.js +120 -0
- package/dist/src/middleware/tests/matchers.spec.js.map +7 -0
- package/dist/src/migrations/definitions.js +63 -0
- package/dist/src/migrations/definitions.js.map +7 -0
- package/dist/src/migrations/index.js +25 -0
- package/dist/src/migrations/index.js.map +7 -0
- package/dist/src/migrations/migrations.js +178 -0
- package/dist/src/migrations/migrations.js.map +7 -0
- package/dist/src/migrations/tests/migrations.spec.js +78 -0
- package/dist/src/migrations/tests/migrations.spec.js.map +7 -0
- package/dist/src/objectStore/buckets/app.js +65 -0
- package/dist/src/objectStore/buckets/app.js.map +7 -0
- package/dist/src/objectStore/buckets/global.js +63 -0
- package/dist/src/objectStore/buckets/global.js.map +7 -0
- package/dist/src/objectStore/buckets/index.js +27 -0
- package/dist/src/objectStore/buckets/index.js.map +7 -0
- package/dist/src/objectStore/buckets/plugins.js +101 -0
- package/dist/src/objectStore/buckets/plugins.js.map +7 -0
- package/dist/src/objectStore/buckets/tests/app.spec.js +171 -0
- package/dist/src/objectStore/buckets/tests/app.spec.js.map +7 -0
- package/dist/src/objectStore/buckets/tests/global.spec.js +87 -0
- package/dist/src/objectStore/buckets/tests/global.spec.js.map +7 -0
- package/dist/src/objectStore/buckets/tests/plugins.spec.js +123 -0
- package/dist/src/objectStore/buckets/tests/plugins.spec.js.map +7 -0
- package/dist/src/objectStore/cloudfront.js +74 -0
- package/dist/src/objectStore/cloudfront.js.map +7 -0
- package/dist/src/objectStore/index.js +27 -0
- package/dist/src/objectStore/index.js.map +7 -0
- package/dist/src/objectStore/objectStore.js +372 -0
- package/dist/src/objectStore/objectStore.js.map +7 -0
- package/dist/src/objectStore/utils.js +58 -0
- package/dist/src/objectStore/utils.js.map +7 -0
- package/dist/src/platform/index.js +45 -0
- package/dist/src/platform/index.js.map +7 -0
- package/dist/src/platform/platformDb.js +33 -0
- package/dist/src/platform/platformDb.js.map +7 -0
- package/dist/src/platform/tenants.js +123 -0
- package/dist/src/platform/tenants.js.map +7 -0
- package/dist/src/platform/tests/tenants.spec.js +46 -0
- package/dist/src/platform/tests/tenants.spec.js.map +7 -0
- package/dist/src/platform/users.js +104 -0
- package/dist/src/platform/users.js.map +7 -0
- package/dist/src/plugin/index.js +23 -0
- package/dist/src/plugin/index.js.map +7 -0
- package/dist/src/plugin/tests/validation.spec.js +97 -0
- package/dist/src/plugin/tests/validation.spec.js.map +7 -0
- package/dist/src/plugin/utils.js +153 -0
- package/dist/src/plugin/utils.js.map +7 -0
- package/dist/src/queue/constants.js +35 -0
- package/dist/src/queue/constants.js.map +7 -0
- package/dist/src/queue/inMemoryQueue.js +139 -0
- package/dist/src/queue/inMemoryQueue.js.map +7 -0
- package/dist/src/queue/index.js +25 -0
- package/dist/src/queue/index.js.map +7 -0
- package/dist/src/queue/listeners.js +177 -0
- package/dist/src/queue/listeners.js.map +7 -0
- package/dist/src/queue/queue.js +85 -0
- package/dist/src/queue/queue.js.map +7 -0
- package/dist/src/redis/index.js +48 -0
- package/dist/src/redis/index.js.map +7 -0
- package/dist/src/redis/init.js +128 -0
- package/dist/src/redis/init.js.map +7 -0
- package/dist/src/redis/redis.js +277 -0
- package/dist/src/redis/redis.js.map +7 -0
- package/dist/src/redis/redlockImpl.js +145 -0
- package/dist/src/redis/redlockImpl.js.map +7 -0
- package/dist/src/redis/utils.js +136 -0
- package/dist/src/redis/utils.js.map +7 -0
- package/dist/src/security/encryption.js +184 -0
- package/dist/src/security/encryption.js.map +7 -0
- package/dist/src/security/permissions.js +188 -0
- package/dist/src/security/permissions.js.map +7 -0
- package/dist/src/security/roles.js +337 -0
- package/dist/src/security/roles.js.map +7 -0
- package/dist/src/security/sessions.js +135 -0
- package/dist/src/security/sessions.js.map +7 -0
- package/dist/src/security/tests/encryption.spec.js +51 -0
- package/dist/src/security/tests/encryption.spec.js.map +7 -0
- package/dist/src/security/tests/permissions.spec.js +154 -0
- package/dist/src/security/tests/permissions.spec.js.map +7 -0
- package/dist/src/security/tests/sessions.spec.js +33 -0
- package/dist/src/security/tests/sessions.spec.js.map +7 -0
- package/dist/src/tenancy/db.js +33 -0
- package/dist/src/tenancy/db.js.map +7 -0
- package/dist/src/tenancy/index.js +25 -0
- package/dist/src/tenancy/index.js.map +7 -0
- package/dist/src/tenancy/tenancy.js +129 -0
- package/dist/src/tenancy/tenancy.js.map +7 -0
- package/dist/src/tenancy/tests/tenancy.spec.js +154 -0
- package/dist/src/tenancy/tests/tenancy.spec.js.map +7 -0
- package/dist/src/timers/index.js +23 -0
- package/dist/src/timers/index.js.map +7 -0
- package/dist/src/timers/timers.js +51 -0
- package/dist/src/timers/timers.js.map +7 -0
- package/dist/src/users/db.js +381 -0
- package/dist/src/users/db.js.map +7 -0
- package/dist/src/users/events.js +152 -0
- package/dist/src/users/events.js.map +7 -0
- package/dist/src/users/index.js +36 -0
- package/dist/src/users/index.js.map +7 -0
- package/dist/src/users/lookup.js +110 -0
- package/dist/src/users/lookup.js.map +7 -0
- package/dist/src/users/users.js +257 -0
- package/dist/src/users/users.js.map +7 -0
- package/dist/src/users/utils.js +95 -0
- package/dist/src/users/utils.js.map +7 -0
- package/dist/src/utils/hashing.js +53 -0
- package/dist/src/utils/hashing.js.map +7 -0
- package/dist/src/utils/index.js +27 -0
- package/dist/src/utils/index.js.map +7 -0
- package/dist/src/utils/stringUtils.js +33 -0
- package/dist/src/utils/stringUtils.js.map +7 -0
- package/dist/src/utils/tests/utils.spec.js +165 -0
- package/dist/src/utils/tests/utils.spec.js.map +7 -0
- package/dist/src/utils/utils.js +207 -0
- package/dist/src/utils/utils.js.map +7 -0
- package/dist/tests/core/logging.js +57 -0
- package/dist/tests/core/logging.js.map +7 -0
- package/dist/tests/core/utilities/index.js +54 -0
- package/dist/tests/core/utilities/index.js.map +7 -0
- package/dist/tests/core/utilities/jestUtils.js +50 -0
- package/dist/tests/core/utilities/jestUtils.js.map +7 -0
- package/dist/tests/core/utilities/mocks/alerts.js +41 -0
- package/dist/tests/core/utilities/mocks/alerts.js.map +7 -0
- package/dist/tests/core/utilities/mocks/date.js +32 -0
- package/dist/tests/core/utilities/mocks/date.js.map +7 -0
- package/dist/tests/core/utilities/mocks/events.js +133 -0
- package/dist/tests/core/utilities/mocks/events.js.map +7 -0
- package/dist/tests/core/utilities/mocks/fetch.js +39 -0
- package/dist/tests/core/utilities/mocks/fetch.js.map +7 -0
- package/dist/tests/core/utilities/mocks/index.js +55 -0
- package/dist/tests/core/utilities/mocks/index.js.map +7 -0
- package/dist/tests/core/utilities/mocks/licenses.js +145 -0
- package/dist/tests/core/utilities/mocks/licenses.js.map +7 -0
- package/dist/tests/core/utilities/mocks/posthog.js +9 -0
- package/dist/tests/core/utilities/mocks/posthog.js.map +7 -0
- package/dist/tests/core/utilities/structures/Chance.js +48 -0
- package/dist/tests/core/utilities/structures/Chance.js.map +7 -0
- package/dist/tests/core/utilities/structures/accounts.js +148 -0
- package/dist/tests/core/utilities/structures/accounts.js.map +7 -0
- package/dist/tests/core/utilities/structures/apps.js +47 -0
- package/dist/tests/core/utilities/structures/apps.js.map +7 -0
- package/dist/tests/core/utilities/structures/common.js +35 -0
- package/dist/tests/core/utilities/structures/common.js.map +7 -0
- package/dist/tests/core/utilities/structures/db.js +40 -0
- package/dist/tests/core/utilities/structures/db.js.map +7 -0
- package/dist/tests/core/utilities/structures/documents/index.js +23 -0
- package/dist/tests/core/utilities/structures/documents/index.js.map +7 -0
- package/dist/tests/core/utilities/structures/documents/platform/index.js +39 -0
- package/dist/tests/core/utilities/structures/documents/platform/index.js.map +7 -0
- package/dist/tests/core/utilities/structures/documents/platform/installation.js +48 -0
- package/dist/tests/core/utilities/structures/documents/platform/installation.js.map +7 -0
- package/dist/tests/core/utilities/structures/generator.js +40 -0
- package/dist/tests/core/utilities/structures/generator.js.map +7 -0
- package/dist/tests/core/utilities/structures/index.js +81 -0
- package/dist/tests/core/utilities/structures/index.js.map +7 -0
- package/dist/tests/core/utilities/structures/koa.js +42 -0
- package/dist/tests/core/utilities/structures/koa.js.map +7 -0
- package/dist/tests/core/utilities/structures/licenses.js +175 -0
- package/dist/tests/core/utilities/structures/licenses.js.map +7 -0
- package/dist/tests/core/utilities/structures/plugins.js +46 -0
- package/dist/tests/core/utilities/structures/plugins.js.map +7 -0
- package/dist/tests/core/utilities/structures/quotas.js +94 -0
- package/dist/tests/core/utilities/structures/quotas.js.map +7 -0
- package/dist/tests/core/utilities/structures/scim.js +90 -0
- package/dist/tests/core/utilities/structures/scim.js.map +7 -0
- package/dist/tests/core/utilities/structures/shared.js +46 -0
- package/dist/tests/core/utilities/structures/shared.js.map +7 -0
- package/dist/tests/core/utilities/structures/sso.js +144 -0
- package/dist/tests/core/utilities/structures/sso.js.map +7 -0
- package/dist/tests/core/utilities/structures/tenants.js +32 -0
- package/dist/tests/core/utilities/structures/tenants.js.map +7 -0
- package/dist/tests/core/utilities/structures/userGroups.js +36 -0
- package/dist/tests/core/utilities/structures/userGroups.js.map +7 -0
- package/dist/tests/core/utilities/structures/users.js +96 -0
- package/dist/tests/core/utilities/structures/users.js.map +7 -0
- package/dist/tests/core/utilities/testContainerUtils.js +100 -0
- package/dist/tests/core/utilities/testContainerUtils.js.map +7 -0
- package/dist/tests/core/utilities/utils/index.js +39 -0
- package/dist/tests/core/utilities/utils/index.js.map +7 -0
- package/dist/tests/core/utilities/utils/time.js +31 -0
- package/dist/tests/core/utilities/utils/time.js.map +7 -0
- package/dist/tests/extra/DBTestConfiguration.js +61 -0
- package/dist/tests/extra/DBTestConfiguration.js.map +7 -0
- package/dist/tests/extra/index.js +42 -0
- package/dist/tests/extra/index.js.map +7 -0
- package/dist/tests/extra/testEnv.js +106 -0
- package/dist/tests/extra/testEnv.js.map +7 -0
- package/dist/tests/index.js +23 -0
- package/dist/tests/index.js.map +7 -0
- package/dist/tests/jestEnv.js +8 -0
- package/dist/tests/jestEnv.js.map +7 -0
- package/dist/tests/jestSetup.js +41 -0
- package/dist/tests/jestSetup.js.map +7 -0
- package/package.json +5 -5
- package/dist/tests.js +0 -8467
- package/dist/tests.js.map +0 -7
- package/dist/tests.js.meta.json +0 -1
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var oidc_exports = {};
|
|
30
|
+
__export(oidc_exports, {
|
|
31
|
+
buildVerifyFn: () => buildVerifyFn,
|
|
32
|
+
fetchStrategyConfig: () => fetchStrategyConfig,
|
|
33
|
+
getCallbackUrl: () => getCallbackUrl,
|
|
34
|
+
strategyFactory: () => strategyFactory
|
|
35
|
+
});
|
|
36
|
+
module.exports = __toCommonJS(oidc_exports);
|
|
37
|
+
var import_node_fetch = __toESM(require("node-fetch"));
|
|
38
|
+
var sso = __toESM(require("./sso"));
|
|
39
|
+
var import_utils = require("../utils");
|
|
40
|
+
var import_utils2 = require("../../../utils");
|
|
41
|
+
var import_types = require("@budibase/types");
|
|
42
|
+
const OIDCStrategy = require("@techpass/passport-openidconnect").Strategy;
|
|
43
|
+
function buildVerifyFn(saveUserFn) {
|
|
44
|
+
return async (issuer, sub, profile, jwtClaims, accessToken, refreshToken, idToken, params, done) => {
|
|
45
|
+
const details = {
|
|
46
|
+
// store the issuer info to enable sync in future
|
|
47
|
+
provider: issuer,
|
|
48
|
+
providerType: import_types.SSOProviderType.OIDC,
|
|
49
|
+
userId: profile.id,
|
|
50
|
+
profile,
|
|
51
|
+
email: getEmail(profile, jwtClaims),
|
|
52
|
+
oauth2: {
|
|
53
|
+
accessToken,
|
|
54
|
+
refreshToken
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
return sso.authenticate(
|
|
58
|
+
details,
|
|
59
|
+
false,
|
|
60
|
+
// don't require local accounts to exist
|
|
61
|
+
done,
|
|
62
|
+
saveUserFn
|
|
63
|
+
);
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function getEmail(profile, jwtClaims) {
|
|
67
|
+
if (profile._json.email) {
|
|
68
|
+
return profile._json.email;
|
|
69
|
+
}
|
|
70
|
+
if (jwtClaims.email) {
|
|
71
|
+
return jwtClaims.email;
|
|
72
|
+
}
|
|
73
|
+
const username = jwtClaims.preferred_username;
|
|
74
|
+
if (username && (0, import_utils2.validEmail)(username)) {
|
|
75
|
+
return username;
|
|
76
|
+
}
|
|
77
|
+
throw new Error(
|
|
78
|
+
`Could not determine user email from profile ${JSON.stringify(
|
|
79
|
+
profile
|
|
80
|
+
)} and claims ${JSON.stringify(jwtClaims)}`
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
async function strategyFactory(config, saveUserFn) {
|
|
84
|
+
try {
|
|
85
|
+
const verify = buildVerifyFn(saveUserFn);
|
|
86
|
+
const strategy = new OIDCStrategy(config, verify);
|
|
87
|
+
strategy.name = "oidc";
|
|
88
|
+
return strategy;
|
|
89
|
+
} catch (err) {
|
|
90
|
+
console.error(err);
|
|
91
|
+
throw new Error(`Error constructing OIDC authentication strategy - ${err}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async function fetchStrategyConfig(oidcConfig, callbackUrl) {
|
|
95
|
+
try {
|
|
96
|
+
const { clientID, clientSecret, configUrl } = oidcConfig;
|
|
97
|
+
if (!clientID || !clientSecret || !callbackUrl || !configUrl) {
|
|
98
|
+
throw new Error(
|
|
99
|
+
"Configuration invalid. Must contain clientID, clientSecret, callbackUrl and configUrl"
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
const response = await (0, import_node_fetch.default)(configUrl);
|
|
103
|
+
if (!response.ok) {
|
|
104
|
+
throw new Error(
|
|
105
|
+
`Unexpected response when fetching openid-configuration: ${response.statusText}`
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
const body = await response.json();
|
|
109
|
+
return {
|
|
110
|
+
issuer: body.issuer,
|
|
111
|
+
authorizationURL: body.authorization_endpoint,
|
|
112
|
+
tokenURL: body.token_endpoint,
|
|
113
|
+
userInfoURL: body.userinfo_endpoint,
|
|
114
|
+
clientID,
|
|
115
|
+
clientSecret,
|
|
116
|
+
callbackURL: callbackUrl
|
|
117
|
+
};
|
|
118
|
+
} catch (err) {
|
|
119
|
+
console.error(err);
|
|
120
|
+
throw new Error(
|
|
121
|
+
`Error constructing OIDC authentication configuration - ${err}`
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async function getCallbackUrl() {
|
|
126
|
+
return (0, import_utils.ssoCallbackUrl)(import_types.ConfigType.OIDC);
|
|
127
|
+
}
|
|
128
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
129
|
+
0 && (module.exports = {
|
|
130
|
+
buildVerifyFn,
|
|
131
|
+
fetchStrategyConfig,
|
|
132
|
+
getCallbackUrl,
|
|
133
|
+
strategyFactory
|
|
134
|
+
});
|
|
135
|
+
//# sourceMappingURL=oidc.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/middleware/passport/sso/oidc.ts"],
|
|
4
|
+
"sourcesContent": ["import fetch from \"node-fetch\"\nimport * as sso from \"./sso\"\nimport { ssoCallbackUrl } from \"../utils\"\nimport { validEmail } from \"../../../utils\"\nimport {\n ConfigType,\n OIDCInnerConfig,\n SSOProfile,\n OIDCStrategyConfiguration,\n SSOAuthDetails,\n SSOProviderType,\n JwtClaims,\n SaveSSOUserFunction,\n} from \"@budibase/types\"\n\nconst OIDCStrategy = require(\"@techpass/passport-openidconnect\").Strategy\n\nexport function buildVerifyFn(saveUserFn: SaveSSOUserFunction) {\n /**\n * @param {*} issuer The identity provider base URL\n * @param {*} sub The user ID\n * @param {*} profile The user profile information. Created by passport from the /userinfo response\n * @param {*} jwtClaims The parsed id_token claims\n * @param {*} accessToken The access_token for contacting the identity provider - may or may not be a JWT\n * @param {*} refreshToken The refresh_token for obtaining a new access_token - usually not a JWT\n * @param {*} idToken The id_token - always a JWT\n * @param {*} params The response body from requesting an access_token\n * @param {*} done The passport callback: err, user, info\n */\n return async (\n issuer: string,\n sub: string,\n profile: SSOProfile,\n jwtClaims: JwtClaims,\n accessToken: string,\n refreshToken: string,\n idToken: string,\n params: any,\n done: Function\n ) => {\n const details: SSOAuthDetails = {\n // store the issuer info to enable sync in future\n provider: issuer,\n providerType: SSOProviderType.OIDC,\n userId: profile.id,\n profile: profile,\n email: getEmail(profile, jwtClaims),\n oauth2: {\n accessToken: accessToken,\n refreshToken: refreshToken,\n },\n }\n\n return sso.authenticate(\n details,\n false, // don't require local accounts to exist\n done,\n saveUserFn\n )\n }\n}\n\n/**\n * @param {*} profile The structured profile created by passport using the user info endpoint\n * @param {*} jwtClaims The claims returned in the id token\n */\nfunction getEmail(profile: SSOProfile, jwtClaims: JwtClaims) {\n // profile not guaranteed to contain email e.g. github connected azure ad account\n if (profile._json.email) {\n return profile._json.email\n }\n\n // fallback to id token email\n if (jwtClaims.email) {\n return jwtClaims.email\n }\n\n // fallback to id token preferred username\n const username = jwtClaims.preferred_username\n if (username && validEmail(username)) {\n return username\n }\n\n throw new Error(\n `Could not determine user email from profile ${JSON.stringify(\n profile\n )} and claims ${JSON.stringify(jwtClaims)}`\n )\n}\n\n/**\n * Create an instance of the oidc passport strategy. This wrapper fetches the configuration\n * from couchDB rather than environment variables, using this factory is necessary for dynamically configuring passport.\n * @returns Dynamically configured Passport OIDC Strategy\n */\nexport async function strategyFactory(\n config: OIDCStrategyConfiguration,\n saveUserFn: SaveSSOUserFunction\n) {\n try {\n const verify = buildVerifyFn(saveUserFn)\n const strategy = new OIDCStrategy(config, verify)\n strategy.name = \"oidc\"\n return strategy\n } catch (err: any) {\n console.error(err)\n throw new Error(`Error constructing OIDC authentication strategy - ${err}`)\n }\n}\n\nexport async function fetchStrategyConfig(\n oidcConfig: OIDCInnerConfig,\n callbackUrl?: string\n): Promise<OIDCStrategyConfiguration> {\n try {\n const { clientID, clientSecret, configUrl } = oidcConfig\n\n if (!clientID || !clientSecret || !callbackUrl || !configUrl) {\n // check for remote config and all required elements\n throw new Error(\n \"Configuration invalid. Must contain clientID, clientSecret, callbackUrl and configUrl\"\n )\n }\n\n const response = await fetch(configUrl)\n\n if (!response.ok) {\n throw new Error(\n `Unexpected response when fetching openid-configuration: ${response.statusText}`\n )\n }\n\n const body = await response.json()\n\n return {\n issuer: body.issuer,\n authorizationURL: body.authorization_endpoint,\n tokenURL: body.token_endpoint,\n userInfoURL: body.userinfo_endpoint,\n clientID: clientID,\n clientSecret: clientSecret,\n callbackURL: callbackUrl,\n }\n } catch (err) {\n console.error(err)\n throw new Error(\n `Error constructing OIDC authentication configuration - ${err}`\n )\n }\n}\n\nexport async function getCallbackUrl() {\n return ssoCallbackUrl(ConfigType.OIDC)\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAkB;AAClB,UAAqB;AACrB,mBAA+B;AAC/B,IAAAA,gBAA2B;AAC3B,mBASO;AAEP,MAAM,eAAe,QAAQ,kCAAkC,EAAE;AAE1D,SAAS,cAAc,YAAiC;AAY7D,SAAO,OACL,QACA,KACA,SACA,WACA,aACA,cACA,SACA,QACA,SACG;AACH,UAAM,UAA0B;AAAA;AAAA,MAE9B,UAAU;AAAA,MACV,cAAc,6BAAgB;AAAA,MAC9B,QAAQ,QAAQ;AAAA,MAChB;AAAA,MACA,OAAO,SAAS,SAAS,SAAS;AAAA,MAClC,QAAQ;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO,IAAI;AAAA,MACT;AAAA,MACA;AAAA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAMA,SAAS,SAAS,SAAqB,WAAsB;AAE3D,MAAI,QAAQ,MAAM,OAAO;AACvB,WAAO,QAAQ,MAAM;AAAA,EACvB;AAGA,MAAI,UAAU,OAAO;AACnB,WAAO,UAAU;AAAA,EACnB;AAGA,QAAM,WAAW,UAAU;AAC3B,MAAI,gBAAY,0BAAW,QAAQ,GAAG;AACpC,WAAO;AAAA,EACT;AAEA,QAAM,IAAI;AAAA,IACR,+CAA+C,KAAK;AAAA,MAClD;AAAA,IACF,CAAC,eAAe,KAAK,UAAU,SAAS,CAAC;AAAA,EAC3C;AACF;AAOA,eAAsB,gBACpB,QACA,YACA;AACA,MAAI;AACF,UAAM,SAAS,cAAc,UAAU;AACvC,UAAM,WAAW,IAAI,aAAa,QAAQ,MAAM;AAChD,aAAS,OAAO;AAChB,WAAO;AAAA,EACT,SAAS,KAAU;AACjB,YAAQ,MAAM,GAAG;AACjB,UAAM,IAAI,MAAM,qDAAqD,GAAG,EAAE;AAAA,EAC5E;AACF;AAEA,eAAsB,oBACpB,YACA,aACoC;AACpC,MAAI;AACF,UAAM,EAAE,UAAU,cAAc,UAAU,IAAI;AAE9C,QAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,eAAe,CAAC,WAAW;AAE5D,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAAW,UAAM,kBAAAC,SAAM,SAAS;AAEtC,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI;AAAA,QACR,2DAA2D,SAAS,UAAU;AAAA,MAChF;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,WAAO;AAAA,MACL,QAAQ,KAAK;AAAA,MACb,kBAAkB,KAAK;AAAA,MACvB,UAAU,KAAK;AAAA,MACf,aAAa,KAAK;AAAA,MAClB;AAAA,MACA;AAAA,MACA,aAAa;AAAA,IACf;AAAA,EACF,SAAS,KAAK;AACZ,YAAQ,MAAM,GAAG;AACjB,UAAM,IAAI;AAAA,MACR,0DAA0D,GAAG;AAAA,IAC/D;AAAA,EACF;AACF;AAEA,eAAsB,iBAAiB;AACrC,aAAO,6BAAe,wBAAW,IAAI;AACvC;",
|
|
6
|
+
"names": ["import_utils", "fetch"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var sso_exports = {};
|
|
30
|
+
__export(sso_exports, {
|
|
31
|
+
authenticate: () => authenticate,
|
|
32
|
+
ssoSaveUserNoOp: () => ssoSaveUserNoOp
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(sso_exports);
|
|
35
|
+
var import_db = require("../../../db");
|
|
36
|
+
var import_utils = require("../utils");
|
|
37
|
+
var users = __toESM(require("../../../users"));
|
|
38
|
+
var context = __toESM(require("../../../context"));
|
|
39
|
+
var import_node_fetch = __toESM(require("node-fetch"));
|
|
40
|
+
const ssoSaveUserNoOp = (user, opts) => Promise.resolve(user);
|
|
41
|
+
async function authenticate(details, requireLocalAccount = true, done, saveUserFn) {
|
|
42
|
+
if (!saveUserFn) {
|
|
43
|
+
throw new Error("Save user function must be provided");
|
|
44
|
+
}
|
|
45
|
+
if (!details.userId) {
|
|
46
|
+
return (0, import_utils.authError)(done, "sso user id required");
|
|
47
|
+
}
|
|
48
|
+
if (!details.email) {
|
|
49
|
+
return (0, import_utils.authError)(done, "sso user email required");
|
|
50
|
+
}
|
|
51
|
+
const userId = (0, import_db.generateGlobalUserID)(details.userId);
|
|
52
|
+
let dbUser;
|
|
53
|
+
try {
|
|
54
|
+
dbUser = await users.getById(userId);
|
|
55
|
+
} catch (err) {
|
|
56
|
+
if (!err.status || err.status !== 404) {
|
|
57
|
+
return (0, import_utils.authError)(
|
|
58
|
+
done,
|
|
59
|
+
"Unexpected error when retrieving existing user",
|
|
60
|
+
err
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (!dbUser) {
|
|
65
|
+
dbUser = await users.getGlobalUserByEmail(details.email);
|
|
66
|
+
}
|
|
67
|
+
if (!dbUser && requireLocalAccount) {
|
|
68
|
+
return (0, import_utils.authError)(
|
|
69
|
+
done,
|
|
70
|
+
"Email does not yet exist. You must set up your local budibase account first."
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
if (!dbUser) {
|
|
74
|
+
dbUser = {
|
|
75
|
+
_id: userId,
|
|
76
|
+
email: details.email,
|
|
77
|
+
roles: {},
|
|
78
|
+
tenantId: context.getTenantId()
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
let ssoUser = await syncUser(dbUser, details);
|
|
82
|
+
ssoUser.forceResetPassword = false;
|
|
83
|
+
try {
|
|
84
|
+
delete ssoUser.password;
|
|
85
|
+
ssoUser = await saveUserFn(ssoUser, {
|
|
86
|
+
hashPassword: false,
|
|
87
|
+
requirePassword: false
|
|
88
|
+
});
|
|
89
|
+
} catch (err) {
|
|
90
|
+
return (0, import_utils.authError)(done, "Error saving user", err);
|
|
91
|
+
}
|
|
92
|
+
return done(null, ssoUser);
|
|
93
|
+
}
|
|
94
|
+
async function getProfilePictureUrl(user, details) {
|
|
95
|
+
const pictureUrl = details.profile?._json.picture;
|
|
96
|
+
if (pictureUrl) {
|
|
97
|
+
const response = await (0, import_node_fetch.default)(pictureUrl);
|
|
98
|
+
if (response.status === 200) {
|
|
99
|
+
const type = response.headers.get("content-type");
|
|
100
|
+
if (type.startsWith("image/")) {
|
|
101
|
+
return pictureUrl;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async function syncUser(user, details) {
|
|
107
|
+
let firstName;
|
|
108
|
+
let lastName;
|
|
109
|
+
let pictureUrl;
|
|
110
|
+
let oauth2;
|
|
111
|
+
let thirdPartyProfile;
|
|
112
|
+
if (details.profile) {
|
|
113
|
+
const profile = details.profile;
|
|
114
|
+
if (profile.name) {
|
|
115
|
+
const name = profile.name;
|
|
116
|
+
if (name.givenName) {
|
|
117
|
+
firstName = name.givenName;
|
|
118
|
+
}
|
|
119
|
+
if (name.familyName) {
|
|
120
|
+
lastName = name.familyName;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
pictureUrl = await getProfilePictureUrl(user, details);
|
|
124
|
+
thirdPartyProfile = {
|
|
125
|
+
...profile._json
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
if (details.oauth2) {
|
|
129
|
+
oauth2 = {
|
|
130
|
+
...details.oauth2
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
...user,
|
|
135
|
+
provider: details.provider,
|
|
136
|
+
providerType: details.providerType,
|
|
137
|
+
firstName,
|
|
138
|
+
lastName,
|
|
139
|
+
thirdPartyProfile,
|
|
140
|
+
pictureUrl,
|
|
141
|
+
oauth2
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
145
|
+
0 && (module.exports = {
|
|
146
|
+
authenticate,
|
|
147
|
+
ssoSaveUserNoOp
|
|
148
|
+
});
|
|
149
|
+
//# sourceMappingURL=sso.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/middleware/passport/sso/sso.ts"],
|
|
4
|
+
"sourcesContent": ["import { generateGlobalUserID } from \"../../../db\"\nimport { authError } from \"../utils\"\nimport * as users from \"../../../users\"\nimport * as context from \"../../../context\"\nimport fetch from \"node-fetch\"\nimport {\n SaveSSOUserFunction,\n SaveUserOpts,\n SSOAuthDetails,\n SSOUser,\n User,\n} from \"@budibase/types\"\n\n// no-op function for user save\n// - this allows datasource auth and access token refresh to work correctly\n// - prefer no-op over an optional argument to ensure function is provided to login flows\nexport const ssoSaveUserNoOp: SaveSSOUserFunction = (\n user: SSOUser,\n opts: SaveUserOpts\n) => Promise.resolve(user)\n\n/**\n * Common authentication logic for third parties. e.g. OAuth, OIDC.\n */\nexport async function authenticate(\n details: SSOAuthDetails,\n requireLocalAccount: boolean = true,\n done: any,\n saveUserFn: SaveSSOUserFunction\n) {\n if (!saveUserFn) {\n throw new Error(\"Save user function must be provided\")\n }\n if (!details.userId) {\n return authError(done, \"sso user id required\")\n }\n if (!details.email) {\n return authError(done, \"sso user email required\")\n }\n\n // use the third party id\n const userId = generateGlobalUserID(details.userId)\n\n let dbUser: User | undefined\n\n // try to load by id\n try {\n dbUser = await users.getById(userId)\n } catch (err: any) {\n // abort when not 404 error\n if (!err.status || err.status !== 404) {\n return authError(\n done,\n \"Unexpected error when retrieving existing user\",\n err\n )\n }\n }\n\n // fallback to loading by email\n if (!dbUser) {\n dbUser = await users.getGlobalUserByEmail(details.email)\n }\n\n // exit early if there is still no user and auto creation is disabled\n if (!dbUser && requireLocalAccount) {\n return authError(\n done,\n \"Email does not yet exist. You must set up your local budibase account first.\"\n )\n }\n\n // first time creation\n if (!dbUser) {\n // setup a blank user using the third party id\n dbUser = {\n _id: userId,\n email: details.email,\n roles: {},\n tenantId: context.getTenantId(),\n }\n }\n\n let ssoUser = await syncUser(dbUser, details)\n // never prompt for password reset\n ssoUser.forceResetPassword = false\n\n try {\n // don't try to re-save any existing password\n delete ssoUser.password\n // create or sync the user\n ssoUser = (await saveUserFn(ssoUser, {\n hashPassword: false,\n requirePassword: false,\n })) as SSOUser\n } catch (err: any) {\n return authError(done, \"Error saving user\", err)\n }\n\n return done(null, ssoUser)\n}\n\nasync function getProfilePictureUrl(user: User, details: SSOAuthDetails) {\n const pictureUrl = details.profile?._json.picture\n if (pictureUrl) {\n const response = await fetch(pictureUrl)\n if (response.status === 200) {\n const type = response.headers.get(\"content-type\") as string\n if (type.startsWith(\"image/\")) {\n return pictureUrl\n }\n }\n }\n}\n\n/**\n * @returns a user that has been sync'd with third party information\n */\nasync function syncUser(user: User, details: SSOAuthDetails): Promise<SSOUser> {\n let firstName\n let lastName\n let pictureUrl\n let oauth2\n let thirdPartyProfile\n\n if (details.profile) {\n const profile = details.profile\n\n if (profile.name) {\n const name = profile.name\n // first name\n if (name.givenName) {\n firstName = name.givenName\n }\n // last name\n if (name.familyName) {\n lastName = name.familyName\n }\n }\n\n pictureUrl = await getProfilePictureUrl(user, details)\n\n thirdPartyProfile = {\n ...profile._json,\n }\n }\n\n // oauth tokens for future use\n if (details.oauth2) {\n oauth2 = {\n ...details.oauth2,\n }\n }\n\n return {\n ...user,\n provider: details.provider,\n providerType: details.providerType,\n firstName,\n lastName,\n thirdPartyProfile,\n pictureUrl,\n oauth2,\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAqC;AACrC,mBAA0B;AAC1B,YAAuB;AACvB,cAAyB;AACzB,wBAAkB;AAYX,MAAM,kBAAuC,CAClD,MACA,SACG,QAAQ,QAAQ,IAAI;AAKzB,eAAsB,aACpB,SACA,sBAA+B,MAC/B,MACA,YACA;AACA,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,qCAAqC;AAAA,EACvD;AACA,MAAI,CAAC,QAAQ,QAAQ;AACnB,eAAO,wBAAU,MAAM,sBAAsB;AAAA,EAC/C;AACA,MAAI,CAAC,QAAQ,OAAO;AAClB,eAAO,wBAAU,MAAM,yBAAyB;AAAA,EAClD;AAGA,QAAM,aAAS,gCAAqB,QAAQ,MAAM;AAElD,MAAI;AAGJ,MAAI;AACF,aAAS,MAAM,MAAM,QAAQ,MAAM;AAAA,EACrC,SAAS,KAAU;AAEjB,QAAI,CAAC,IAAI,UAAU,IAAI,WAAW,KAAK;AACrC,iBAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI,CAAC,QAAQ;AACX,aAAS,MAAM,MAAM,qBAAqB,QAAQ,KAAK;AAAA,EACzD;AAGA,MAAI,CAAC,UAAU,qBAAqB;AAClC,eAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,MAAI,CAAC,QAAQ;AAEX,aAAS;AAAA,MACP,KAAK;AAAA,MACL,OAAO,QAAQ;AAAA,MACf,OAAO,CAAC;AAAA,MACR,UAAU,QAAQ,YAAY;AAAA,IAChC;AAAA,EACF;AAEA,MAAI,UAAU,MAAM,SAAS,QAAQ,OAAO;AAE5C,UAAQ,qBAAqB;AAE7B,MAAI;AAEF,WAAO,QAAQ;AAEf,cAAW,MAAM,WAAW,SAAS;AAAA,MACnC,cAAc;AAAA,MACd,iBAAiB;AAAA,IACnB,CAAC;AAAA,EACH,SAAS,KAAU;AACjB,eAAO,wBAAU,MAAM,qBAAqB,GAAG;AAAA,EACjD;AAEA,SAAO,KAAK,MAAM,OAAO;AAC3B;AAEA,eAAe,qBAAqB,MAAY,SAAyB;AACvE,QAAM,aAAa,QAAQ,SAAS,MAAM;AAC1C,MAAI,YAAY;AACd,UAAM,WAAW,UAAM,kBAAAA,SAAM,UAAU;AACvC,QAAI,SAAS,WAAW,KAAK;AAC3B,YAAM,OAAO,SAAS,QAAQ,IAAI,cAAc;AAChD,UAAI,KAAK,WAAW,QAAQ,GAAG;AAC7B,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF;AAKA,eAAe,SAAS,MAAY,SAA2C;AAC7E,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AAEJ,MAAI,QAAQ,SAAS;AACnB,UAAM,UAAU,QAAQ;AAExB,QAAI,QAAQ,MAAM;AAChB,YAAM,OAAO,QAAQ;AAErB,UAAI,KAAK,WAAW;AAClB,oBAAY,KAAK;AAAA,MACnB;AAEA,UAAI,KAAK,YAAY;AACnB,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AAEA,iBAAa,MAAM,qBAAqB,MAAM,OAAO;AAErD,wBAAoB;AAAA,MAClB,GAAG,QAAQ;AAAA,IACb;AAAA,EACF;AAGA,MAAI,QAAQ,QAAQ;AAClB,aAAS;AAAA,MACP,GAAG,QAAQ;AAAA,IACb;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,UAAU,QAAQ;AAAA,IAClB,cAAc,QAAQ;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;",
|
|
6
|
+
"names": ["fetch"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __copyProps = (to, from, except, desc) => {
|
|
9
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
10
|
+
for (let key of __getOwnPropNames(from))
|
|
11
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
12
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
13
|
+
}
|
|
14
|
+
return to;
|
|
15
|
+
};
|
|
16
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
17
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
18
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
19
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
20
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
21
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
22
|
+
mod
|
|
23
|
+
));
|
|
24
|
+
var import_tests = require("../../../../../tests");
|
|
25
|
+
var import_types = require("@budibase/types");
|
|
26
|
+
var _sso = __toESM(require("../sso"));
|
|
27
|
+
var google = __toESM(require("../google"));
|
|
28
|
+
jest.mock("passport-google-oauth");
|
|
29
|
+
const mockStrategy = require("passport-google-oauth").OAuth2Strategy;
|
|
30
|
+
jest.mock("../sso");
|
|
31
|
+
const sso = jest.mocked(_sso);
|
|
32
|
+
const mockSaveUserFn = jest.fn();
|
|
33
|
+
const mockDone = jest.fn();
|
|
34
|
+
describe("google", () => {
|
|
35
|
+
describe("strategyFactory", () => {
|
|
36
|
+
const googleConfig = import_tests.structures.sso.googleConfig();
|
|
37
|
+
const callbackUrl = import_tests.generator.url();
|
|
38
|
+
it("should create successfully create a google strategy", async () => {
|
|
39
|
+
await google.strategyFactory(googleConfig, callbackUrl, mockSaveUserFn);
|
|
40
|
+
const expectedOptions = {
|
|
41
|
+
clientID: googleConfig.clientID,
|
|
42
|
+
clientSecret: googleConfig.clientSecret,
|
|
43
|
+
callbackURL: callbackUrl
|
|
44
|
+
};
|
|
45
|
+
expect(mockStrategy).toHaveBeenCalledWith(
|
|
46
|
+
expectedOptions,
|
|
47
|
+
expect.anything()
|
|
48
|
+
);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe("authenticate", () => {
|
|
52
|
+
const details = import_tests.structures.sso.authDetails();
|
|
53
|
+
details.provider = "google";
|
|
54
|
+
details.providerType = import_types.SSOProviderType.GOOGLE;
|
|
55
|
+
const profile = details.profile;
|
|
56
|
+
profile.provider = "google";
|
|
57
|
+
beforeEach(() => {
|
|
58
|
+
jest.clearAllMocks();
|
|
59
|
+
});
|
|
60
|
+
it("delegates authentication to third party common", async () => {
|
|
61
|
+
const authenticate = await google.buildVerifyFn(mockSaveUserFn);
|
|
62
|
+
await authenticate(
|
|
63
|
+
details.oauth2.accessToken,
|
|
64
|
+
details.oauth2.refreshToken,
|
|
65
|
+
profile,
|
|
66
|
+
mockDone
|
|
67
|
+
);
|
|
68
|
+
expect(sso.authenticate).toHaveBeenCalledWith(
|
|
69
|
+
details,
|
|
70
|
+
true,
|
|
71
|
+
mockDone,
|
|
72
|
+
mockSaveUserFn
|
|
73
|
+
);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=google.spec.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/middleware/passport/sso/tests/google.spec.ts"],
|
|
4
|
+
"sourcesContent": ["import { generator, structures } from \"../../../../../tests\"\nimport { SSOProviderType } from \"@budibase/types\"\n\njest.mock(\"passport-google-oauth\")\nconst mockStrategy = require(\"passport-google-oauth\").OAuth2Strategy\n\njest.mock(\"../sso\")\nimport * as _sso from \"../sso\"\nconst sso = jest.mocked(_sso)\n\nconst mockSaveUserFn = jest.fn()\nconst mockDone = jest.fn()\n\nimport * as google from \"../google\"\n\ndescribe(\"google\", () => {\n describe(\"strategyFactory\", () => {\n const googleConfig = structures.sso.googleConfig()\n const callbackUrl = generator.url()\n\n it(\"should create successfully create a google strategy\", async () => {\n await google.strategyFactory(googleConfig, callbackUrl, mockSaveUserFn)\n\n const expectedOptions = {\n clientID: googleConfig.clientID,\n clientSecret: googleConfig.clientSecret,\n callbackURL: callbackUrl,\n }\n\n expect(mockStrategy).toHaveBeenCalledWith(\n expectedOptions,\n expect.anything()\n )\n })\n })\n\n describe(\"authenticate\", () => {\n const details = structures.sso.authDetails()\n details.provider = \"google\"\n details.providerType = SSOProviderType.GOOGLE\n\n const profile = details.profile!\n profile.provider = \"google\"\n\n beforeEach(() => {\n jest.clearAllMocks()\n })\n\n it(\"delegates authentication to third party common\", async () => {\n const authenticate = await google.buildVerifyFn(mockSaveUserFn)\n\n await authenticate(\n details.oauth2.accessToken,\n details.oauth2.refreshToken!,\n profile,\n mockDone\n )\n\n expect(sso.authenticate).toHaveBeenCalledWith(\n details,\n true,\n mockDone,\n mockSaveUserFn\n )\n })\n })\n})\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;AAAA,mBAAsC;AACtC,mBAAgC;AAMhC,WAAsB;AAMtB,aAAwB;AAVxB,KAAK,KAAK,uBAAuB;AACjC,MAAM,eAAe,QAAQ,uBAAuB,EAAE;AAEtD,KAAK,KAAK,QAAQ;AAElB,MAAM,MAAM,KAAK,OAAO,IAAI;AAE5B,MAAM,iBAAiB,KAAK,GAAG;AAC/B,MAAM,WAAW,KAAK,GAAG;AAIzB,SAAS,UAAU,MAAM;AACvB,WAAS,mBAAmB,MAAM;AAChC,UAAM,eAAe,wBAAW,IAAI,aAAa;AACjD,UAAM,cAAc,uBAAU,IAAI;AAElC,OAAG,uDAAuD,YAAY;AACpE,YAAM,OAAO,gBAAgB,cAAc,aAAa,cAAc;AAEtE,YAAM,kBAAkB;AAAA,QACtB,UAAU,aAAa;AAAA,QACvB,cAAc,aAAa;AAAA,QAC3B,aAAa;AAAA,MACf;AAEA,aAAO,YAAY,EAAE;AAAA,QACnB;AAAA,QACA,OAAO,SAAS;AAAA,MAClB;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,WAAS,gBAAgB,MAAM;AAC7B,UAAM,UAAU,wBAAW,IAAI,YAAY;AAC3C,YAAQ,WAAW;AACnB,YAAQ,eAAe,6BAAgB;AAEvC,UAAM,UAAU,QAAQ;AACxB,YAAQ,WAAW;AAEnB,eAAW,MAAM;AACf,WAAK,cAAc;AAAA,IACrB,CAAC;AAED,OAAG,kDAAkD,YAAY;AAC/D,YAAM,eAAe,MAAM,OAAO,cAAc,cAAc;AAE9D,YAAM;AAAA,QACJ,QAAQ,OAAO;AAAA,QACf,QAAQ,OAAO;AAAA,QACf;AAAA,QACA;AAAA,MACF;AAEA,aAAO,IAAI,YAAY,EAAE;AAAA,QACvB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __copyProps = (to, from, except, desc) => {
|
|
9
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
10
|
+
for (let key of __getOwnPropNames(from))
|
|
11
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
12
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
13
|
+
}
|
|
14
|
+
return to;
|
|
15
|
+
};
|
|
16
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
17
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
18
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
19
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
20
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
21
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
22
|
+
mod
|
|
23
|
+
));
|
|
24
|
+
var import_tests = require("../../../../../tests");
|
|
25
|
+
var import_types = require("@budibase/types");
|
|
26
|
+
var _sso = __toESM(require("../sso"));
|
|
27
|
+
var oidc = __toESM(require("../oidc"));
|
|
28
|
+
jest.mock("@techpass/passport-openidconnect");
|
|
29
|
+
const mockStrategy = require("@techpass/passport-openidconnect").Strategy;
|
|
30
|
+
jest.mock("../sso");
|
|
31
|
+
const sso = jest.mocked(_sso);
|
|
32
|
+
const mockSaveUser = jest.fn();
|
|
33
|
+
const mockDone = jest.fn();
|
|
34
|
+
describe("oidc", () => {
|
|
35
|
+
const callbackUrl = import_tests.generator.url();
|
|
36
|
+
const oidcConfig = import_tests.structures.sso.oidcConfig();
|
|
37
|
+
const wellKnownConfig = import_tests.structures.sso.oidcWellKnownConfig();
|
|
38
|
+
function mockRetrieveWellKnownConfig() {
|
|
39
|
+
import_tests.mocks.fetch.mockReturnValue({
|
|
40
|
+
ok: true,
|
|
41
|
+
json: () => wellKnownConfig
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
beforeEach(() => {
|
|
45
|
+
mockRetrieveWellKnownConfig();
|
|
46
|
+
});
|
|
47
|
+
describe("strategyFactory", () => {
|
|
48
|
+
it("should create successfully create an oidc strategy", async () => {
|
|
49
|
+
const strategyConfiguration = await oidc.fetchStrategyConfig(
|
|
50
|
+
oidcConfig,
|
|
51
|
+
callbackUrl
|
|
52
|
+
);
|
|
53
|
+
await oidc.strategyFactory(strategyConfiguration, mockSaveUser);
|
|
54
|
+
expect(import_tests.mocks.fetch).toHaveBeenCalledWith(oidcConfig.configUrl);
|
|
55
|
+
const expectedOptions = {
|
|
56
|
+
issuer: wellKnownConfig.issuer,
|
|
57
|
+
authorizationURL: wellKnownConfig.authorization_endpoint,
|
|
58
|
+
tokenURL: wellKnownConfig.token_endpoint,
|
|
59
|
+
userInfoURL: wellKnownConfig.userinfo_endpoint,
|
|
60
|
+
clientID: oidcConfig.clientID,
|
|
61
|
+
clientSecret: oidcConfig.clientSecret,
|
|
62
|
+
callbackURL: callbackUrl
|
|
63
|
+
};
|
|
64
|
+
expect(mockStrategy).toHaveBeenCalledWith(
|
|
65
|
+
expectedOptions,
|
|
66
|
+
expect.anything()
|
|
67
|
+
);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
describe("authenticate", () => {
|
|
71
|
+
const details = import_tests.structures.sso.authDetails();
|
|
72
|
+
details.providerType = import_types.SSOProviderType.OIDC;
|
|
73
|
+
const profile = details.profile;
|
|
74
|
+
const issuer = profile.provider;
|
|
75
|
+
const sub = import_tests.generator.string();
|
|
76
|
+
const idToken = import_tests.generator.string();
|
|
77
|
+
const params = {};
|
|
78
|
+
let authenticateFn;
|
|
79
|
+
let jwtClaims;
|
|
80
|
+
beforeEach(async () => {
|
|
81
|
+
jest.clearAllMocks();
|
|
82
|
+
authenticateFn = await oidc.buildVerifyFn(mockSaveUser);
|
|
83
|
+
});
|
|
84
|
+
async function authenticate() {
|
|
85
|
+
await authenticateFn(
|
|
86
|
+
issuer,
|
|
87
|
+
sub,
|
|
88
|
+
profile,
|
|
89
|
+
jwtClaims,
|
|
90
|
+
details.oauth2.accessToken,
|
|
91
|
+
details.oauth2.refreshToken,
|
|
92
|
+
idToken,
|
|
93
|
+
params,
|
|
94
|
+
mockDone
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
it("passes auth details to sso module", async () => {
|
|
98
|
+
await authenticate();
|
|
99
|
+
expect(sso.authenticate).toHaveBeenCalledWith(
|
|
100
|
+
details,
|
|
101
|
+
false,
|
|
102
|
+
mockDone,
|
|
103
|
+
mockSaveUser
|
|
104
|
+
);
|
|
105
|
+
});
|
|
106
|
+
it("uses JWT email to get email", async () => {
|
|
107
|
+
delete profile._json.email;
|
|
108
|
+
jwtClaims = {
|
|
109
|
+
email: details.email
|
|
110
|
+
};
|
|
111
|
+
await authenticate();
|
|
112
|
+
expect(sso.authenticate).toHaveBeenCalledWith(
|
|
113
|
+
details,
|
|
114
|
+
false,
|
|
115
|
+
mockDone,
|
|
116
|
+
mockSaveUser
|
|
117
|
+
);
|
|
118
|
+
});
|
|
119
|
+
it("uses JWT username to get email", async () => {
|
|
120
|
+
delete profile._json.email;
|
|
121
|
+
jwtClaims = {
|
|
122
|
+
email: details.email
|
|
123
|
+
};
|
|
124
|
+
await authenticate();
|
|
125
|
+
expect(sso.authenticate).toHaveBeenCalledWith(
|
|
126
|
+
details,
|
|
127
|
+
false,
|
|
128
|
+
mockDone,
|
|
129
|
+
mockSaveUser
|
|
130
|
+
);
|
|
131
|
+
});
|
|
132
|
+
it("uses JWT invalid username to get email", async () => {
|
|
133
|
+
delete profile._json.email;
|
|
134
|
+
jwtClaims = {
|
|
135
|
+
preferred_username: "invalidUsername"
|
|
136
|
+
};
|
|
137
|
+
await expect(authenticate()).rejects.toThrow(
|
|
138
|
+
"Could not determine user email from profile"
|
|
139
|
+
);
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
//# sourceMappingURL=oidc.spec.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/middleware/passport/sso/tests/oidc.spec.ts"],
|
|
4
|
+
"sourcesContent": ["import { generator, mocks, structures } from \"../../../../../tests\"\nimport {\n JwtClaims,\n OIDCInnerConfig,\n SSOAuthDetails,\n SSOProviderType,\n} from \"@budibase/types\"\nimport * as _sso from \"../sso\"\nimport * as oidc from \"../oidc\"\n\njest.mock(\"@techpass/passport-openidconnect\")\nconst mockStrategy = require(\"@techpass/passport-openidconnect\").Strategy\n\njest.mock(\"../sso\")\nconst sso = jest.mocked(_sso)\n\nconst mockSaveUser = jest.fn()\nconst mockDone = jest.fn()\n\ndescribe(\"oidc\", () => {\n const callbackUrl = generator.url()\n const oidcConfig: OIDCInnerConfig = structures.sso.oidcConfig()\n const wellKnownConfig = structures.sso.oidcWellKnownConfig()\n\n function mockRetrieveWellKnownConfig() {\n // mock the request to retrieve the oidc configuration\n mocks.fetch.mockReturnValue({\n ok: true,\n json: () => wellKnownConfig,\n })\n }\n\n beforeEach(() => {\n mockRetrieveWellKnownConfig()\n })\n\n describe(\"strategyFactory\", () => {\n it(\"should create successfully create an oidc strategy\", async () => {\n const strategyConfiguration = await oidc.fetchStrategyConfig(\n oidcConfig,\n callbackUrl\n )\n await oidc.strategyFactory(strategyConfiguration, mockSaveUser)\n\n expect(mocks.fetch).toHaveBeenCalledWith(oidcConfig.configUrl)\n\n const expectedOptions = {\n issuer: wellKnownConfig.issuer,\n authorizationURL: wellKnownConfig.authorization_endpoint,\n tokenURL: wellKnownConfig.token_endpoint,\n userInfoURL: wellKnownConfig.userinfo_endpoint,\n clientID: oidcConfig.clientID,\n clientSecret: oidcConfig.clientSecret,\n callbackURL: callbackUrl,\n }\n expect(mockStrategy).toHaveBeenCalledWith(\n expectedOptions,\n expect.anything()\n )\n })\n })\n\n describe(\"authenticate\", () => {\n const details: SSOAuthDetails = structures.sso.authDetails()\n details.providerType = SSOProviderType.OIDC\n const profile = details.profile!\n const issuer = profile.provider\n\n const sub = generator.string()\n const idToken = generator.string()\n const params = {}\n\n let authenticateFn: any\n let jwtClaims: JwtClaims\n\n beforeEach(async () => {\n jest.clearAllMocks()\n authenticateFn = await oidc.buildVerifyFn(mockSaveUser)\n })\n\n async function authenticate() {\n await authenticateFn(\n issuer,\n sub,\n profile,\n jwtClaims,\n details.oauth2.accessToken,\n details.oauth2.refreshToken,\n idToken,\n params,\n mockDone\n )\n }\n\n it(\"passes auth details to sso module\", async () => {\n await authenticate()\n\n expect(sso.authenticate).toHaveBeenCalledWith(\n details,\n false,\n mockDone,\n mockSaveUser\n )\n })\n\n it(\"uses JWT email to get email\", async () => {\n delete profile._json.email\n\n jwtClaims = {\n email: details.email,\n }\n\n await authenticate()\n\n expect(sso.authenticate).toHaveBeenCalledWith(\n details,\n false,\n mockDone,\n mockSaveUser\n )\n })\n\n it(\"uses JWT username to get email\", async () => {\n delete profile._json.email\n\n jwtClaims = {\n email: details.email,\n }\n\n await authenticate()\n\n expect(sso.authenticate).toHaveBeenCalledWith(\n details,\n false,\n mockDone,\n mockSaveUser\n )\n })\n\n it(\"uses JWT invalid username to get email\", async () => {\n delete profile._json.email\n\n jwtClaims = {\n preferred_username: \"invalidUsername\",\n }\n\n await expect(authenticate()).rejects.toThrow(\n \"Could not determine user email from profile\"\n )\n })\n })\n})\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;AAAA,mBAA6C;AAC7C,mBAKO;AACP,WAAsB;AACtB,WAAsB;AAEtB,KAAK,KAAK,kCAAkC;AAC5C,MAAM,eAAe,QAAQ,kCAAkC,EAAE;AAEjE,KAAK,KAAK,QAAQ;AAClB,MAAM,MAAM,KAAK,OAAO,IAAI;AAE5B,MAAM,eAAe,KAAK,GAAG;AAC7B,MAAM,WAAW,KAAK,GAAG;AAEzB,SAAS,QAAQ,MAAM;AACrB,QAAM,cAAc,uBAAU,IAAI;AAClC,QAAM,aAA8B,wBAAW,IAAI,WAAW;AAC9D,QAAM,kBAAkB,wBAAW,IAAI,oBAAoB;AAE3D,WAAS,8BAA8B;AAErC,uBAAM,MAAM,gBAAgB;AAAA,MAC1B,IAAI;AAAA,MACJ,MAAM,MAAM;AAAA,IACd,CAAC;AAAA,EACH;AAEA,aAAW,MAAM;AACf,gCAA4B;AAAA,EAC9B,CAAC;AAED,WAAS,mBAAmB,MAAM;AAChC,OAAG,sDAAsD,YAAY;AACnE,YAAM,wBAAwB,MAAM,KAAK;AAAA,QACvC;AAAA,QACA;AAAA,MACF;AACA,YAAM,KAAK,gBAAgB,uBAAuB,YAAY;AAE9D,aAAO,mBAAM,KAAK,EAAE,qBAAqB,WAAW,SAAS;AAE7D,YAAM,kBAAkB;AAAA,QACtB,QAAQ,gBAAgB;AAAA,QACxB,kBAAkB,gBAAgB;AAAA,QAClC,UAAU,gBAAgB;AAAA,QAC1B,aAAa,gBAAgB;AAAA,QAC7B,UAAU,WAAW;AAAA,QACrB,cAAc,WAAW;AAAA,QACzB,aAAa;AAAA,MACf;AACA,aAAO,YAAY,EAAE;AAAA,QACnB;AAAA,QACA,OAAO,SAAS;AAAA,MAClB;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,WAAS,gBAAgB,MAAM;AAC7B,UAAM,UAA0B,wBAAW,IAAI,YAAY;AAC3D,YAAQ,eAAe,6BAAgB;AACvC,UAAM,UAAU,QAAQ;AACxB,UAAM,SAAS,QAAQ;AAEvB,UAAM,MAAM,uBAAU,OAAO;AAC7B,UAAM,UAAU,uBAAU,OAAO;AACjC,UAAM,SAAS,CAAC;AAEhB,QAAI;AACJ,QAAI;AAEJ,eAAW,YAAY;AACrB,WAAK,cAAc;AACnB,uBAAiB,MAAM,KAAK,cAAc,YAAY;AAAA,IACxD,CAAC;AAED,mBAAe,eAAe;AAC5B,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ,OAAO;AAAA,QACf,QAAQ,OAAO;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,OAAG,qCAAqC,YAAY;AAClD,YAAM,aAAa;AAEnB,aAAO,IAAI,YAAY,EAAE;AAAA,QACvB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAED,OAAG,+BAA+B,YAAY;AAC5C,aAAO,QAAQ,MAAM;AAErB,kBAAY;AAAA,QACV,OAAO,QAAQ;AAAA,MACjB;AAEA,YAAM,aAAa;AAEnB,aAAO,IAAI,YAAY,EAAE;AAAA,QACvB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAED,OAAG,kCAAkC,YAAY;AAC/C,aAAO,QAAQ,MAAM;AAErB,kBAAY;AAAA,QACV,OAAO,QAAQ;AAAA,MACjB;AAEA,YAAM,aAAa;AAEnB,aAAO,IAAI,YAAY,EAAE;AAAA,QACvB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAED,OAAG,0CAA0C,YAAY;AACvD,aAAO,QAAQ,MAAM;AAErB,kBAAY;AAAA,QACV,oBAAoB;AAAA,MACtB;AAEA,YAAM,OAAO,aAAa,CAAC,EAAE,QAAQ;AAAA,QACnC;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|