@budibase/backend-core 2.9.39-alpha.8 → 2.9.39
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/jest.config.js +25 -0
- package/dist/jest.config.js.map +1 -0
- package/dist/package.json +5 -5
- package/dist/src/accounts/accounts.js +75 -92
- package/dist/src/accounts/accounts.js.map +1 -7
- package/dist/src/accounts/api.js +85 -71
- package/dist/src/accounts/api.js.map +1 -7
- package/dist/src/accounts/index.js +16 -21
- package/dist/src/accounts/index.js.map +1 -7
- package/dist/src/auth/auth.js +178 -197
- package/dist/src/auth/auth.js.map +1 -7
- package/dist/src/auth/index.js +16 -21
- package/dist/src/auth/index.js.map +1 -7
- package/dist/src/blacklist/blacklist.js +69 -81
- package/dist/src/blacklist/blacklist.js.map +1 -7
- package/dist/src/blacklist/index.js +16 -21
- package/dist/src/blacklist/index.js.map +1 -7
- package/dist/src/cache/appMetadata.js +88 -78
- package/dist/src/cache/appMetadata.js.map +1 -7
- package/dist/src/cache/base/index.js +110 -92
- package/dist/src/cache/base/index.js.map +1 -7
- package/dist/src/cache/generic.js +26 -64
- package/dist/src/cache/generic.js.map +1 -7
- package/dist/src/cache/index.js +32 -48
- package/dist/src/cache/index.js.map +1 -7
- package/dist/src/cache/user.js +115 -91
- package/dist/src/cache/user.js.map +1 -7
- package/dist/src/cache/writethrough.js +144 -129
- package/dist/src/cache/writethrough.js.map +1 -7
- package/dist/src/configs/configs.js +265 -215
- package/dist/src/configs/configs.js.map +1 -7
- package/dist/src/configs/index.js +16 -21
- package/dist/src/configs/index.js.map +1 -7
- package/dist/src/constants/db.js +64 -104
- package/dist/src/constants/db.js.map +1 -7
- package/dist/src/constants/index.js +17 -23
- package/dist/src/constants/index.js.map +1 -7
- package/dist/src/constants/misc.js +53 -91
- package/dist/src/constants/misc.js.map +1 -7
- package/dist/src/context/Context.js +11 -33
- package/dist/src/context/Context.js.map +1 -7
- package/dist/src/context/identity.js +60 -75
- package/dist/src/context/identity.js.map +1 -7
- package/dist/src/context/index.js +31 -42
- package/dist/src/context/index.js.map +1 -7
- package/dist/src/context/mainContext.js +275 -264
- package/dist/src/context/mainContext.js.map +1 -7
- package/dist/src/context/types.js +2 -16
- package/dist/src/context/types.js.map +1 -7
- package/dist/src/db/Replication.js +81 -85
- package/dist/src/db/Replication.js.map +1 -7
- package/dist/src/db/constants.js +11 -37
- package/dist/src/db/constants.js.map +1 -7
- package/dist/src/db/couch/DatabaseImpl.js +236 -212
- package/dist/src/db/couch/DatabaseImpl.js.map +1 -7
- package/dist/src/db/couch/connections.js +81 -96
- package/dist/src/db/couch/connections.js.map +1 -7
- package/dist/src/db/couch/index.js +25 -42
- package/dist/src/db/couch/index.js.map +1 -7
- package/dist/src/db/couch/pouchDB.js +93 -103
- package/dist/src/db/couch/pouchDB.js.map +1 -7
- package/dist/src/db/couch/pouchDump.js +1 -1
- package/dist/src/db/couch/pouchDump.js.map +1 -7
- package/dist/src/db/couch/utils.js +49 -70
- package/dist/src/db/couch/utils.js.map +1 -7
- package/dist/src/db/db.js +49 -63
- package/dist/src/db/db.js.map +1 -7
- package/dist/src/db/errors.js +17 -38
- package/dist/src/db/errors.js.map +1 -7
- package/dist/src/db/index.js +45 -61
- package/dist/src/db/index.js.map +1 -7
- package/dist/src/db/lucene.js +655 -582
- package/dist/src/db/lucene.js.map +1 -7
- package/dist/src/db/searchIndexes/index.js +16 -21
- package/dist/src/db/searchIndexes/index.js.map +1 -7
- package/dist/src/db/searchIndexes/searchIndexes.js +72 -77
- package/dist/src/db/searchIndexes/searchIndexes.js.map +1 -7
- package/dist/src/db/utils.js +199 -184
- package/dist/src/db/utils.js.map +1 -7
- package/dist/src/db/views.js +187 -191
- package/dist/src/db/views.js.map +1 -7
- package/dist/src/docIds/conversions.js +48 -69
- package/dist/src/docIds/conversions.js.map +1 -7
- package/dist/src/docIds/ids.js +87 -76
- package/dist/src/docIds/ids.js.map +1 -7
- package/dist/src/docIds/index.js +17 -23
- package/dist/src/docIds/index.js.map +1 -7
- package/dist/src/docIds/newid.js +6 -29
- package/dist/src/docIds/newid.js.map +1 -7
- package/dist/src/docIds/params.js +111 -109
- package/dist/src/docIds/params.js.map +1 -7
- package/dist/src/docUpdates/index.js +29 -54
- package/dist/src/docUpdates/index.js.map +1 -7
- package/dist/src/environment.js +81 -152
- package/dist/src/environment.js.map +1 -7
- package/dist/src/errors/errors.js +77 -106
- package/dist/src/errors/errors.js.map +1 -7
- package/dist/src/errors/index.js +16 -21
- package/dist/src/errors/index.js.map +1 -7
- package/dist/src/events/analytics.js +38 -38
- package/dist/src/events/analytics.js.map +1 -7
- package/dist/src/events/asyncEvents/index.js +17 -23
- package/dist/src/events/asyncEvents/index.js.map +1 -7
- package/dist/src/events/asyncEvents/publisher.js +24 -36
- package/dist/src/events/asyncEvents/publisher.js.map +1 -7
- package/dist/src/events/asyncEvents/queue.js +21 -37
- package/dist/src/events/asyncEvents/queue.js.map +1 -7
- package/dist/src/events/backfill.js +170 -163
- package/dist/src/events/backfill.js.map +1 -7
- package/dist/src/events/documentId.js +23 -46
- package/dist/src/events/documentId.js.map +1 -7
- package/dist/src/events/events.js +68 -58
- package/dist/src/events/events.js.map +1 -7
- package/dist/src/events/identification.js +279 -254
- package/dist/src/events/identification.js.map +1 -7
- package/dist/src/events/index.js +42 -57
- package/dist/src/events/index.js.map +1 -7
- package/dist/src/events/processors/AnalyticsProcessor.js +81 -64
- package/dist/src/events/processors/AnalyticsProcessor.js.map +1 -7
- package/dist/src/events/processors/AuditLogsProcessor.js +79 -90
- package/dist/src/events/processors/AuditLogsProcessor.js.map +1 -7
- package/dist/src/events/processors/LoggingProcessor.js +39 -50
- package/dist/src/events/processors/LoggingProcessor.js.map +1 -7
- package/dist/src/events/processors/Processors.js +44 -49
- package/dist/src/events/processors/Processors.js.map +1 -7
- package/dist/src/events/processors/async/DocumentUpdateProcessor.js +37 -46
- package/dist/src/events/processors/async/DocumentUpdateProcessor.js.map +1 -7
- package/dist/src/events/processors/index.js +18 -52
- package/dist/src/events/processors/index.js.map +1 -7
- package/dist/src/events/processors/posthog/PosthogProcessor.js +126 -113
- package/dist/src/events/processors/posthog/PosthogProcessor.js.map +1 -7
- package/dist/src/events/processors/posthog/index.js +6 -34
- package/dist/src/events/processors/posthog/index.js.map +1 -7
- package/dist/src/events/processors/posthog/rateLimiting.js +104 -90
- package/dist/src/events/processors/posthog/rateLimiting.js.map +1 -7
- package/dist/src/events/processors/types.js +2 -28
- package/dist/src/events/processors/types.js.map +1 -7
- package/dist/src/events/publishers/account.js +37 -43
- package/dist/src/events/publishers/account.js.map +1 -7
- package/dist/src/events/publishers/app.js +139 -131
- package/dist/src/events/publishers/app.js.map +1 -7
- package/dist/src/events/publishers/auditLog.js +29 -37
- package/dist/src/events/publishers/auditLog.js.map +1 -7
- package/dist/src/events/publishers/auth.js +71 -71
- package/dist/src/events/publishers/auth.js.map +1 -7
- package/dist/src/events/publishers/automation.js +108 -102
- package/dist/src/events/publishers/automation.js.map +1 -7
- package/dist/src/events/publishers/backfill.js +75 -82
- package/dist/src/events/publishers/backfill.js.map +1 -7
- package/dist/src/events/publishers/backup.js +36 -44
- package/dist/src/events/publishers/backup.js.map +1 -7
- package/dist/src/events/publishers/datasource.js +46 -51
- package/dist/src/events/publishers/datasource.js.map +1 -7
- package/dist/src/events/publishers/email.js +25 -33
- package/dist/src/events/publishers/email.js.map +1 -7
- package/dist/src/events/publishers/environmentVariable.js +38 -47
- package/dist/src/events/publishers/environmentVariable.js.map +1 -7
- package/dist/src/events/publishers/group.js +97 -95
- package/dist/src/events/publishers/group.js.map +1 -7
- package/dist/src/events/publishers/index.js +53 -106
- package/dist/src/events/publishers/index.js.map +1 -7
- package/dist/src/events/publishers/installation.js +45 -49
- package/dist/src/events/publishers/installation.js.map +1 -7
- package/dist/src/events/publishers/layout.js +29 -37
- package/dist/src/events/publishers/layout.js.map +1 -7
- package/dist/src/events/publishers/license.js +67 -68
- package/dist/src/events/publishers/license.js.map +1 -7
- package/dist/src/events/publishers/org.js +44 -45
- package/dist/src/events/publishers/org.js.map +1 -7
- package/dist/src/events/publishers/plugin.js +49 -55
- package/dist/src/events/publishers/plugin.js.map +1 -7
- package/dist/src/events/publishers/query.js +70 -81
- package/dist/src/events/publishers/query.js.map +1 -7
- package/dist/src/events/publishers/role.js +61 -63
- package/dist/src/events/publishers/role.js.map +1 -7
- package/dist/src/events/publishers/rows.js +28 -39
- package/dist/src/events/publishers/rows.js.map +1 -7
- package/dist/src/events/publishers/screen.js +41 -47
- package/dist/src/events/publishers/screen.js.map +1 -7
- package/dist/src/events/publishers/serve.js +41 -47
- package/dist/src/events/publishers/serve.js.map +1 -7
- package/dist/src/events/publishers/table.js +69 -71
- package/dist/src/events/publishers/table.js.map +1 -7
- package/dist/src/events/publishers/user.js +184 -173
- package/dist/src/events/publishers/user.js.map +1 -7
- package/dist/src/events/publishers/view.js +98 -89
- package/dist/src/events/publishers/view.js.map +1 -7
- package/dist/src/features/index.js +88 -93
- package/dist/src/features/index.js.map +1 -7
- package/dist/src/features/installation.js +16 -38
- package/dist/src/features/installation.js.map +1 -7
- package/dist/src/helpers.js +11 -28
- package/dist/src/helpers.js.map +1 -7
- package/dist/src/index.js +77 -148
- package/dist/src/index.js.map +1 -7
- package/dist/src/installation.js +127 -128
- package/dist/src/installation.js.map +1 -7
- package/dist/src/logging/alerts.js +14 -39
- package/dist/src/logging/alerts.js.map +1 -7
- package/dist/src/logging/correlation/correlation.js +11 -35
- package/dist/src/logging/correlation/correlation.js.map +1 -7
- package/dist/src/logging/correlation/index.js +16 -21
- package/dist/src/logging/correlation/index.js.map +1 -7
- package/dist/src/logging/correlation/middleware.js +13 -33
- package/dist/src/logging/correlation/middleware.js.map +1 -7
- package/dist/src/logging/index.js +32 -45
- package/dist/src/logging/index.js.map +1 -7
- package/dist/src/logging/pino/logger.js +206 -185
- package/dist/src/logging/pino/logger.js.map +1 -7
- package/dist/src/logging/pino/middleware.js +38 -68
- package/dist/src/logging/pino/middleware.js.map +1 -7
- package/dist/src/logging/system.js +86 -95
- package/dist/src/logging/system.js.map +1 -7
- package/dist/src/middleware/adminOnly.js +16 -28
- package/dist/src/middleware/adminOnly.js.map +1 -7
- package/dist/src/middleware/auditLog.js +13 -24
- package/dist/src/middleware/auditLog.js.map +1 -7
- package/dist/src/middleware/authenticated.js +191 -165
- package/dist/src/middleware/authenticated.js.map +1 -7
- package/dist/src/middleware/builderOnly.js +29 -44
- package/dist/src/middleware/builderOnly.js.map +1 -7
- package/dist/src/middleware/builderOrAdmin.js +29 -44
- package/dist/src/middleware/builderOrAdmin.js.map +1 -7
- package/dist/src/middleware/csrf.js +75 -54
- package/dist/src/middleware/csrf.js.map +1 -7
- package/dist/src/middleware/errorHandling.js +60 -58
- package/dist/src/middleware/errorHandling.js.map +1 -7
- package/dist/src/middleware/index.js +61 -91
- package/dist/src/middleware/index.js.map +1 -7
- package/dist/src/middleware/internalApi.js +27 -36
- package/dist/src/middleware/internalApi.js.map +1 -7
- package/dist/src/middleware/joi-validator.js +39 -65
- package/dist/src/middleware/joi-validator.js.map +1 -7
- package/dist/src/middleware/matchers.js +36 -55
- package/dist/src/middleware/matchers.js.map +1 -7
- package/dist/src/middleware/passport/datasource/google.js +88 -96
- package/dist/src/middleware/passport/datasource/google.js.map +1 -7
- package/dist/src/middleware/passport/local.js +74 -66
- package/dist/src/middleware/passport/local.js.map +1 -7
- package/dist/src/middleware/passport/sso/google.js +81 -84
- package/dist/src/middleware/passport/sso/google.js.map +1 -7
- package/dist/src/middleware/passport/sso/oidc.js +140 -124
- package/dist/src/middleware/passport/sso/oidc.js.map +1 -7
- package/dist/src/middleware/passport/sso/sso.js +157 -141
- package/dist/src/middleware/passport/sso/sso.js.map +1 -7
- package/dist/src/middleware/passport/utils.js +60 -56
- package/dist/src/middleware/passport/utils.js.map +1 -7
- package/dist/src/middleware/querystringToBody.js +26 -42
- package/dist/src/middleware/querystringToBody.js.map +1 -7
- package/dist/src/middleware/tenancy.js +33 -42
- package/dist/src/middleware/tenancy.js.map +1 -7
- package/dist/src/migrations/definitions.js +37 -61
- package/dist/src/migrations/definitions.js.map +1 -7
- package/dist/src/migrations/index.js +17 -23
- package/dist/src/migrations/index.js.map +1 -7
- package/dist/src/migrations/migrations.js +182 -162
- package/dist/src/migrations/migrations.js.map +1 -7
- package/dist/src/objectStore/buckets/app.js +65 -57
- package/dist/src/objectStore/buckets/app.js.map +1 -7
- package/dist/src/objectStore/buckets/global.js +50 -55
- package/dist/src/objectStore/buckets/global.js.map +1 -7
- package/dist/src/objectStore/buckets/index.js +18 -25
- package/dist/src/objectStore/buckets/index.js.map +1 -7
- package/dist/src/objectStore/buckets/plugins.js +76 -82
- package/dist/src/objectStore/buckets/plugins.js.map +1 -7
- package/dist/src/objectStore/cloudfront.js +27 -61
- package/dist/src/objectStore/cloudfront.js.map +1 -7
- package/dist/src/objectStore/index.js +18 -25
- package/dist/src/objectStore/index.js.map +1 -7
- package/dist/src/objectStore/objectStore.js +351 -341
- package/dist/src/objectStore/objectStore.js.map +1 -7
- package/dist/src/objectStore/utils.js +26 -52
- package/dist/src/objectStore/utils.js.map +1 -7
- package/dist/src/platform/index.js +30 -42
- package/dist/src/platform/index.js.map +1 -7
- package/dist/src/platform/platformDb.js +7 -30
- package/dist/src/platform/platformDb.js.map +1 -7
- package/dist/src/platform/tenants.js +126 -110
- package/dist/src/platform/tenants.js.map +1 -7
- package/dist/src/platform/users.js +84 -92
- package/dist/src/platform/users.js.map +1 -7
- package/dist/src/plugin/index.js +16 -21
- package/dist/src/plugin/index.js.map +1 -7
- package/dist/src/plugin/utils.js +129 -137
- package/dist/src/plugin/utils.js.map +1 -7
- package/dist/src/queue/constants.js +10 -34
- package/dist/src/queue/constants.js.map +1 -7
- package/dist/src/queue/inMemoryQueue.js +137 -131
- package/dist/src/queue/inMemoryQueue.js.map +1 -7
- package/dist/src/queue/index.js +17 -23
- package/dist/src/queue/index.js.map +1 -7
- package/dist/src/queue/listeners.js +170 -161
- package/dist/src/queue/listeners.js.map +1 -7
- package/dist/src/queue/queue.js +83 -76
- package/dist/src/queue/queue.js.map +1 -7
- package/dist/src/redis/index.js +34 -45
- package/dist/src/redis/index.js.map +1 -7
- package/dist/src/redis/init.js +125 -115
- package/dist/src/redis/init.js.map +1 -7
- package/dist/src/redis/redis.js +302 -244
- package/dist/src/redis/redis.js.map +1 -7
- package/dist/src/redis/redlockImpl.js +152 -135
- package/dist/src/redis/redlockImpl.js.map +1 -7
- package/dist/src/redis/utils.js +115 -128
- package/dist/src/redis/utils.js.map +1 -7
- package/dist/src/security/encryption.js +141 -162
- package/dist/src/security/encryption.js.map +1 -7
- package/dist/src/security/permissions.js +132 -170
- package/dist/src/security/permissions.js.map +1 -7
- package/dist/src/security/roles.js +319 -298
- package/dist/src/security/roles.js.map +1 -7
- package/dist/src/security/sessions.js +106 -120
- package/dist/src/security/sessions.js.map +1 -7
- package/dist/src/tenancy/db.js +7 -30
- package/dist/src/tenancy/db.js.map +1 -7
- package/dist/src/tenancy/index.js +17 -23
- package/dist/src/tenancy/index.js.map +1 -7
- package/dist/src/tenancy/tenancy.js +101 -114
- package/dist/src/tenancy/tenancy.js.map +1 -7
- package/dist/src/timers/index.js +16 -21
- package/dist/src/timers/index.js.map +1 -7
- package/dist/src/timers/timers.js +18 -43
- package/dist/src/timers/timers.js.map +1 -7
- package/dist/src/users/db.js +403 -357
- package/dist/src/users/db.js.map +1 -7
- package/dist/src/users/events.js +150 -133
- package/dist/src/users/events.js.map +1 -7
- package/dist/src/users/index.js +21 -34
- package/dist/src/users/index.js.map +1 -7
- package/dist/src/users/lookup.js +104 -102
- package/dist/src/users/lookup.js.map +1 -7
- package/dist/src/users/users.js +244 -240
- package/dist/src/users/users.js.map +1 -7
- package/dist/src/users/utils.js +87 -90
- package/dist/src/users/utils.js.map +1 -7
- package/dist/src/utils/hashing.js +42 -48
- package/dist/src/utils/hashing.js.map +1 -7
- package/dist/src/utils/index.js +18 -25
- package/dist/src/utils/index.js.map +1 -7
- package/dist/src/utils/stringUtils.js +6 -30
- package/dist/src/utils/stringUtils.js.map +1 -7
- package/dist/src/utils/utils.js +212 -172
- package/dist/src/utils/utils.js.map +1 -7
- package/dist/tests/core/logging.js +21 -45
- package/dist/tests/core/logging.js.map +1 -7
- package/dist/tests/core/utilities/index.js +34 -51
- package/dist/tests/core/utilities/index.js.map +1 -7
- package/dist/tests/core/utilities/jestUtils.js +16 -45
- package/dist/tests/core/utilities/jestUtils.js.map +1 -7
- package/dist/tests/core/utilities/mocks/alerts.js +27 -38
- package/dist/tests/core/utilities/mocks/alerts.js.map +1 -7
- package/dist/tests/core/utilities/mocks/date.js +5 -31
- package/dist/tests/core/utilities/mocks/date.js.map +1 -7
- package/dist/tests/core/utilities/mocks/events.js +141 -131
- package/dist/tests/core/utilities/mocks/events.js.map +1 -7
- package/dist/tests/core/utilities/mocks/fetch.js +10 -34
- package/dist/tests/core/utilities/mocks/fetch.js.map +1 -7
- package/dist/tests/core/utilities/mocks/index.js +39 -51
- package/dist/tests/core/utilities/mocks/index.js.map +1 -7
- package/dist/tests/core/utilities/mocks/licenses.js +67 -107
- package/dist/tests/core/utilities/mocks/licenses.js.map +1 -7
- package/dist/tests/core/utilities/mocks/posthog.js +6 -6
- package/dist/tests/core/utilities/mocks/posthog.js.map +1 -7
- package/dist/tests/core/utilities/structures/Chance.js +17 -44
- package/dist/tests/core/utilities/structures/Chance.js.map +1 -7
- package/dist/tests/core/utilities/structures/accounts.js +61 -131
- package/dist/tests/core/utilities/structures/accounts.js.map +1 -7
- package/dist/tests/core/utilities/structures/apps.js +21 -44
- package/dist/tests/core/utilities/structures/apps.js.map +1 -7
- package/dist/tests/core/utilities/structures/common.js +8 -32
- package/dist/tests/core/utilities/structures/common.js.map +1 -7
- package/dist/tests/core/utilities/structures/db.js +11 -35
- package/dist/tests/core/utilities/structures/db.js.map +1 -7
- package/dist/tests/core/utilities/structures/documents/index.js +16 -21
- package/dist/tests/core/utilities/structures/documents/index.js.map +1 -7
- package/dist/tests/core/utilities/structures/documents/platform/index.js +26 -37
- package/dist/tests/core/utilities/structures/documents/platform/index.js.map +1 -7
- package/dist/tests/core/utilities/structures/documents/platform/installation.js +34 -44
- package/dist/tests/core/utilities/structures/documents/platform/installation.js.map +1 -7
- package/dist/tests/core/utilities/structures/generator.js +7 -38
- package/dist/tests/core/utilities/structures/generator.js.map +1 -7
- package/dist/tests/core/utilities/structures/index.js +43 -78
- package/dist/tests/core/utilities/structures/index.js.map +1 -7
- package/dist/tests/core/utilities/structures/koa.js +7 -39
- package/dist/tests/core/utilities/structures/koa.js.map +1 -7
- package/dist/tests/core/utilities/structures/licenses.js +121 -156
- package/dist/tests/core/utilities/structures/licenses.js.map +1 -7
- package/dist/tests/core/utilities/structures/plugins.js +20 -43
- package/dist/tests/core/utilities/structures/plugins.js.map +1 -7
- package/dist/tests/core/utilities/structures/quotas.js +67 -90
- package/dist/tests/core/utilities/structures/quotas.js.map +1 -7
- package/dist/tests/core/utilities/structures/scim.js +57 -84
- package/dist/tests/core/utilities/structures/scim.js.map +1 -7
- package/dist/tests/core/utilities/structures/shared.js +9 -41
- package/dist/tests/core/utilities/structures/shared.js.map +1 -7
- package/dist/tests/core/utilities/structures/sso.js +112 -124
- package/dist/tests/core/utilities/structures/sso.js.map +1 -7
- package/dist/tests/core/utilities/structures/tenants.js +6 -29
- package/dist/tests/core/utilities/structures/tenants.js.map +1 -7
- package/dist/tests/core/utilities/structures/userGroups.js +10 -33
- package/dist/tests/core/utilities/structures/userGroups.js.map +1 -7
- package/dist/tests/core/utilities/structures/users.js +36 -84
- package/dist/tests/core/utilities/structures/users.js.map +1 -7
- package/dist/tests/core/utilities/testContainerUtils.js +59 -84
- package/dist/tests/core/utilities/testContainerUtils.js.map +1 -7
- package/dist/tests/core/utilities/utils/index.js +26 -37
- package/dist/tests/core/utilities/utils/index.js.map +1 -7
- package/dist/tests/core/utilities/utils/time.js +5 -28
- package/dist/tests/core/utilities/utils/time.js.map +1 -7
- package/dist/tests/extra/DBTestConfiguration.js +50 -56
- package/dist/tests/extra/DBTestConfiguration.js.map +1 -7
- package/dist/tests/extra/index.js +30 -39
- package/dist/tests/extra/index.js.map +1 -7
- package/dist/tests/extra/testEnv.js +105 -84
- package/dist/tests/extra/testEnv.js.map +1 -7
- package/dist/tests/index.js +16 -21
- package/dist/tests/index.js.map +1 -7
- package/dist/tests/jestEnv.js +1 -1
- package/dist/tests/jestEnv.js.map +1 -7
- package/dist/tests/jestSetup.js +20 -33
- package/dist/tests/jestSetup.js.map +1 -7
- package/package.json +5 -5
- package/dist/plugins.js +0 -290
- package/dist/plugins.js.map +0 -7
- package/dist/plugins.js.meta.json +0 -1
- package/dist/src/auth/tests/auth.spec.js +0 -37
- package/dist/src/auth/tests/auth.spec.js.map +0 -7
- package/dist/src/blacklist/tests/blacklist.spec.js +0 -61
- package/dist/src/blacklist/tests/blacklist.spec.js.map +0 -7
- package/dist/src/cache/tests/writethrough.spec.js +0 -132
- package/dist/src/cache/tests/writethrough.spec.js.map +0 -7
- package/dist/src/configs/tests/configs.spec.js +0 -182
- package/dist/src/configs/tests/configs.spec.js.map +0 -7
- package/dist/src/context/tests/index.spec.js +0 -147
- package/dist/src/context/tests/index.spec.js.map +0 -7
- package/dist/src/db/tests/index.spec.js +0 -24
- package/dist/src/db/tests/index.spec.js.map +0 -7
- package/dist/src/db/tests/lucene.spec.js +0 -312
- package/dist/src/db/tests/lucene.spec.js.map +0 -7
- package/dist/src/db/tests/pouch.spec.js +0 -63
- package/dist/src/db/tests/pouch.spec.js.map +0 -7
- package/dist/src/db/tests/utils.spec.js +0 -50
- package/dist/src/db/tests/utils.spec.js.map +0 -7
- package/dist/src/events/processors/posthog/tests/PosthogProcessor.spec.js +0 -154
- package/dist/src/events/processors/posthog/tests/PosthogProcessor.spec.js.map +0 -7
- package/dist/src/features/tests/featureFlags.spec.js +0 -86
- package/dist/src/features/tests/featureFlags.spec.js.map +0 -7
- package/dist/src/logging/tests/system.spec.js +0 -59
- package/dist/src/logging/tests/system.spec.js.map +0 -7
- package/dist/src/middleware/passport/sso/tests/google.spec.js +0 -77
- package/dist/src/middleware/passport/sso/tests/google.spec.js.map +0 -7
- package/dist/src/middleware/passport/sso/tests/oidc.spec.js +0 -143
- package/dist/src/middleware/passport/sso/tests/oidc.spec.js.map +0 -7
- package/dist/src/middleware/passport/sso/tests/sso.spec.js +0 -167
- package/dist/src/middleware/passport/sso/tests/sso.spec.js.map +0 -7
- package/dist/src/middleware/tests/builder.spec.js +0 -169
- package/dist/src/middleware/tests/builder.spec.js.map +0 -7
- package/dist/src/middleware/tests/matchers.spec.js +0 -120
- package/dist/src/middleware/tests/matchers.spec.js.map +0 -7
- package/dist/src/migrations/tests/migrations.spec.js +0 -78
- package/dist/src/migrations/tests/migrations.spec.js.map +0 -7
- package/dist/src/objectStore/buckets/tests/app.spec.js +0 -171
- package/dist/src/objectStore/buckets/tests/app.spec.js.map +0 -7
- package/dist/src/objectStore/buckets/tests/global.spec.js +0 -87
- package/dist/src/objectStore/buckets/tests/global.spec.js.map +0 -7
- package/dist/src/objectStore/buckets/tests/plugins.spec.js +0 -123
- package/dist/src/objectStore/buckets/tests/plugins.spec.js.map +0 -7
- package/dist/src/platform/tests/tenants.spec.js +0 -46
- package/dist/src/platform/tests/tenants.spec.js.map +0 -7
- package/dist/src/plugin/tests/validation.spec.js +0 -97
- package/dist/src/plugin/tests/validation.spec.js.map +0 -7
- package/dist/src/security/tests/encryption.spec.js +0 -51
- package/dist/src/security/tests/encryption.spec.js.map +0 -7
- package/dist/src/security/tests/permissions.spec.js +0 -154
- package/dist/src/security/tests/permissions.spec.js.map +0 -7
- package/dist/src/security/tests/sessions.spec.js +0 -33
- package/dist/src/security/tests/sessions.spec.js.map +0 -7
- package/dist/src/tenancy/tests/tenancy.spec.js +0 -154
- package/dist/src/tenancy/tests/tenancy.spec.js.map +0 -7
- package/dist/src/utils/tests/utils.spec.js +0 -165
- package/dist/src/utils/tests/utils.spec.js.map +0 -7
package/dist/src/users/db.js
CHANGED
|
@@ -1,381 +1,427 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
var
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
11
24
|
};
|
|
12
|
-
var
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
25
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
28
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
29
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
30
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
31
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
|
+
});
|
|
19
33
|
};
|
|
20
|
-
var
|
|
21
|
-
|
|
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 db_exports = {};
|
|
30
|
-
__export(db_exports, {
|
|
31
|
-
UserDB: () => UserDB
|
|
32
|
-
});
|
|
33
|
-
module.exports = __toCommonJS(db_exports);
|
|
34
|
-
var import_environment = __toESM(require("../environment"));
|
|
35
|
-
var eventHelpers = __toESM(require("./events"));
|
|
36
|
-
var accounts = __toESM(require("../accounts"));
|
|
37
|
-
var accountSdk = __toESM(require("../accounts"));
|
|
38
|
-
var cache = __toESM(require("../cache"));
|
|
39
|
-
var import_context = require("../context");
|
|
40
|
-
var dbUtils = __toESM(require("../db"));
|
|
41
|
-
var import_errors = require("../errors");
|
|
42
|
-
var platform = __toESM(require("../platform"));
|
|
43
|
-
var sessions = __toESM(require("../security/sessions"));
|
|
44
|
-
var usersCore = __toESM(require("./users"));
|
|
45
|
-
var import_types = require("@budibase/types");
|
|
46
|
-
var import_utils = require("./utils");
|
|
47
|
-
var import_lookup = require("./lookup");
|
|
48
|
-
var import_utils2 = require("../utils");
|
|
49
|
-
const bulkDeleteProcessing = async (dbUser) => {
|
|
50
|
-
const userId = dbUser._id;
|
|
51
|
-
await platform.users.removeUser(dbUser);
|
|
52
|
-
await eventHelpers.handleDeleteEvents(dbUser);
|
|
53
|
-
await cache.user.invalidateUser(userId);
|
|
54
|
-
await sessions.invalidateSessions(userId, { reason: "bulk-deletion" });
|
|
34
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
35
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
55
36
|
};
|
|
37
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
+
exports.UserDB = void 0;
|
|
39
|
+
const environment_1 = __importDefault(require("../environment"));
|
|
40
|
+
const eventHelpers = __importStar(require("./events"));
|
|
41
|
+
const accounts = __importStar(require("../accounts"));
|
|
42
|
+
const accountSdk = __importStar(require("../accounts"));
|
|
43
|
+
const cache = __importStar(require("../cache"));
|
|
44
|
+
const context_1 = require("../context");
|
|
45
|
+
const dbUtils = __importStar(require("../db"));
|
|
46
|
+
const errors_1 = require("../errors");
|
|
47
|
+
const platform = __importStar(require("../platform"));
|
|
48
|
+
const sessions = __importStar(require("../security/sessions"));
|
|
49
|
+
const usersCore = __importStar(require("./users"));
|
|
50
|
+
const types_1 = require("@budibase/types");
|
|
51
|
+
const utils_1 = require("./utils");
|
|
52
|
+
const lookup_1 = require("./lookup");
|
|
53
|
+
const utils_2 = require("../utils");
|
|
54
|
+
const bulkDeleteProcessing = (dbUser) => __awaiter(void 0, void 0, void 0, function* () {
|
|
55
|
+
const userId = dbUser._id;
|
|
56
|
+
yield platform.users.removeUser(dbUser);
|
|
57
|
+
yield eventHelpers.handleDeleteEvents(dbUser);
|
|
58
|
+
yield cache.user.invalidateUser(userId);
|
|
59
|
+
yield sessions.invalidateSessions(userId, { reason: "bulk-deletion" });
|
|
60
|
+
});
|
|
56
61
|
class UserDB {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
}
|
|
62
|
-
static async isPreventPasswordActions(user, account) {
|
|
63
|
-
if (import_environment.default.ENABLE_SSO_MAINTENANCE_MODE && (0, import_utils.isAdmin)(user)) {
|
|
64
|
-
return false;
|
|
65
|
-
}
|
|
66
|
-
if (await UserDB.features.isSSOEnforced()) {
|
|
67
|
-
return true;
|
|
68
|
-
}
|
|
69
|
-
if ((0, import_types.isSSOUser)(user)) {
|
|
70
|
-
return true;
|
|
62
|
+
static init(quotaFns, groupFns, featureFns) {
|
|
63
|
+
UserDB.quotas = quotaFns;
|
|
64
|
+
UserDB.groups = groupFns;
|
|
65
|
+
UserDB.features = featureFns;
|
|
71
66
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
67
|
+
static isPreventPasswordActions(user, account) {
|
|
68
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
69
|
+
// when in maintenance mode we allow sso users with the admin role
|
|
70
|
+
// to perform any password action - this prevents lockout
|
|
71
|
+
if (environment_1.default.ENABLE_SSO_MAINTENANCE_MODE && (0, utils_1.isAdmin)(user)) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
// SSO is enforced for all users
|
|
75
|
+
if (yield UserDB.features.isSSOEnforced()) {
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
// Check local sso
|
|
79
|
+
if ((0, types_1.isSSOUser)(user)) {
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
// Check account sso
|
|
83
|
+
if (!account) {
|
|
84
|
+
account = yield accountSdk.getAccountByTenantId((0, context_1.getTenantId)());
|
|
85
|
+
}
|
|
86
|
+
return !!(account && account.email === user.email && (0, types_1.isSSOAccount)(account));
|
|
87
|
+
});
|
|
93
88
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
89
|
+
static buildUser(user, opts = {
|
|
90
|
+
hashPassword: true,
|
|
91
|
+
requirePassword: true,
|
|
92
|
+
}, tenantId, dbUser, account) {
|
|
93
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
94
|
+
let { password, _id } = user;
|
|
95
|
+
// don't require a password if the db user doesn't already have one
|
|
96
|
+
if (dbUser && !dbUser.password) {
|
|
97
|
+
opts.requirePassword = false;
|
|
98
|
+
}
|
|
99
|
+
let hashedPassword;
|
|
100
|
+
if (password) {
|
|
101
|
+
if (yield UserDB.isPreventPasswordActions(user, account)) {
|
|
102
|
+
throw new errors_1.HTTPError("Password change is disabled for this user", 400);
|
|
103
|
+
}
|
|
104
|
+
hashedPassword = opts.hashPassword ? yield (0, utils_2.hash)(password) : password;
|
|
105
|
+
}
|
|
106
|
+
else if (dbUser) {
|
|
107
|
+
hashedPassword = dbUser.password;
|
|
108
|
+
}
|
|
109
|
+
// passwords are never required if sso is enforced
|
|
110
|
+
const requirePasswords = opts.requirePassword && !(yield UserDB.features.isSSOEnforced());
|
|
111
|
+
if (!hashedPassword && requirePasswords) {
|
|
112
|
+
throw "Password must be specified.";
|
|
113
|
+
}
|
|
114
|
+
_id = _id || dbUtils.generateGlobalUserID();
|
|
115
|
+
const fullUser = Object.assign(Object.assign(Object.assign({ createdAt: Date.now() }, dbUser), user), { _id, password: hashedPassword, tenantId });
|
|
116
|
+
// make sure the roles object is always present
|
|
117
|
+
if (!fullUser.roles) {
|
|
118
|
+
fullUser.roles = {};
|
|
119
|
+
}
|
|
120
|
+
// add the active status to a user if its not provided
|
|
121
|
+
if (fullUser.status == null) {
|
|
122
|
+
fullUser.status = types_1.UserStatus.ACTIVE;
|
|
123
|
+
}
|
|
124
|
+
return fullUser;
|
|
125
|
+
});
|
|
97
126
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
};
|
|
107
|
-
if (!fullUser.roles) {
|
|
108
|
-
fullUser.roles = {};
|
|
127
|
+
static allUsers() {
|
|
128
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
129
|
+
const db = (0, context_1.getGlobalDB)();
|
|
130
|
+
const response = yield db.allDocs(dbUtils.getGlobalUserParams(null, {
|
|
131
|
+
include_docs: true,
|
|
132
|
+
}));
|
|
133
|
+
return response.rows.map((row) => row.doc);
|
|
134
|
+
});
|
|
109
135
|
}
|
|
110
|
-
|
|
111
|
-
|
|
136
|
+
static countUsersByApp(appId) {
|
|
137
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
138
|
+
let response = yield usersCore.searchGlobalUsersByApp(appId, {});
|
|
139
|
+
return {
|
|
140
|
+
userCount: response.length,
|
|
141
|
+
};
|
|
142
|
+
});
|
|
112
143
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
return response.rows.map((row) => row.doc);
|
|
123
|
-
}
|
|
124
|
-
static async countUsersByApp(appId) {
|
|
125
|
-
let response = await usersCore.searchGlobalUsersByApp(appId, {});
|
|
126
|
-
return {
|
|
127
|
-
userCount: response.length
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
static async getUsersByAppAccess(appId) {
|
|
131
|
-
const opts = {
|
|
132
|
-
include_docs: true,
|
|
133
|
-
limit: 50
|
|
134
|
-
};
|
|
135
|
-
let response = await usersCore.searchGlobalUsersByAppAccess(
|
|
136
|
-
appId,
|
|
137
|
-
opts
|
|
138
|
-
);
|
|
139
|
-
return response;
|
|
140
|
-
}
|
|
141
|
-
static async getUserByEmail(email) {
|
|
142
|
-
return usersCore.getGlobalUserByEmail(email);
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Gets a user by ID from the global database, based on the current tenancy.
|
|
146
|
-
*/
|
|
147
|
-
static async getUser(userId) {
|
|
148
|
-
const user = await usersCore.getById(userId);
|
|
149
|
-
if (user) {
|
|
150
|
-
delete user.password;
|
|
144
|
+
static getUsersByAppAccess(appId) {
|
|
145
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
146
|
+
const opts = {
|
|
147
|
+
include_docs: true,
|
|
148
|
+
limit: 50,
|
|
149
|
+
};
|
|
150
|
+
let response = yield usersCore.searchGlobalUsersByAppAccess(appId, opts);
|
|
151
|
+
return response;
|
|
152
|
+
});
|
|
151
153
|
}
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
}
|
|
157
|
-
static async bulkUpdate(users) {
|
|
158
|
-
return await usersCore.bulkUpdateGlobalUsers(users);
|
|
159
|
-
}
|
|
160
|
-
static async save(user, opts = {}) {
|
|
161
|
-
if (opts.hashPassword == null) {
|
|
162
|
-
opts.hashPassword = true;
|
|
154
|
+
static getUserByEmail(email) {
|
|
155
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
156
|
+
return usersCore.getGlobalUserByEmail(email);
|
|
157
|
+
});
|
|
163
158
|
}
|
|
164
|
-
|
|
165
|
-
|
|
159
|
+
/**
|
|
160
|
+
* Gets a user by ID from the global database, based on the current tenancy.
|
|
161
|
+
*/
|
|
162
|
+
static getUser(userId) {
|
|
163
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
164
|
+
const user = yield usersCore.getById(userId);
|
|
165
|
+
if (user) {
|
|
166
|
+
delete user.password;
|
|
167
|
+
}
|
|
168
|
+
return user;
|
|
169
|
+
});
|
|
166
170
|
}
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
throw new Error("_id or email is required");
|
|
171
|
+
static bulkGet(userIds) {
|
|
172
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
173
|
+
return yield usersCore.bulkGetGlobalUsersById(userIds);
|
|
174
|
+
});
|
|
172
175
|
}
|
|
173
|
-
|
|
174
|
-
|
|
176
|
+
static bulkUpdate(users) {
|
|
177
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
178
|
+
return yield usersCore.bulkUpdateGlobalUsers(users);
|
|
179
|
+
});
|
|
175
180
|
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
181
|
+
static save(user, opts = {}) {
|
|
182
|
+
var _a, _b;
|
|
183
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
184
|
+
// default booleans to true
|
|
185
|
+
if (opts.hashPassword == null) {
|
|
186
|
+
opts.hashPassword = true;
|
|
187
|
+
}
|
|
188
|
+
if (opts.requirePassword == null) {
|
|
189
|
+
opts.requirePassword = true;
|
|
190
|
+
}
|
|
191
|
+
const tenantId = (0, context_1.getTenantId)();
|
|
192
|
+
const db = (0, context_1.getGlobalDB)();
|
|
193
|
+
let { email, _id, userGroups = [], roles } = user;
|
|
194
|
+
if (!email && !_id) {
|
|
195
|
+
throw new Error("_id or email is required");
|
|
196
|
+
}
|
|
197
|
+
if (((_b = (_a = user.builder) === null || _a === void 0 ? void 0 : _a.apps) === null || _b === void 0 ? void 0 : _b.length) &&
|
|
198
|
+
!(yield UserDB.features.isAppBuildersEnabled())) {
|
|
199
|
+
throw new Error("Unable to update app builders, please check license");
|
|
200
|
+
}
|
|
201
|
+
let dbUser;
|
|
202
|
+
if (_id) {
|
|
203
|
+
// try to get existing user from db
|
|
204
|
+
try {
|
|
205
|
+
dbUser = (yield db.get(_id));
|
|
206
|
+
if (email && dbUser.email !== email) {
|
|
207
|
+
throw "Email address cannot be changed";
|
|
208
|
+
}
|
|
209
|
+
email = dbUser.email;
|
|
210
|
+
}
|
|
211
|
+
catch (e) {
|
|
212
|
+
if (e.status === 404) {
|
|
213
|
+
// do nothing, save this new user with the id specified - required for SSO auth
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
throw e;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
if (!dbUser && email) {
|
|
221
|
+
// no id was specified - load from email instead
|
|
222
|
+
dbUser = yield usersCore.getGlobalUserByEmail(email);
|
|
223
|
+
if (dbUser && dbUser._id !== _id) {
|
|
224
|
+
throw new errors_1.EmailUnavailableError(email);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
const change = dbUser ? 0 : 1; // no change if there is existing user
|
|
228
|
+
return UserDB.quotas.addUsers(change, () => __awaiter(this, void 0, void 0, function* () {
|
|
229
|
+
yield (0, utils_1.validateUniqueUser)(email, tenantId);
|
|
230
|
+
let builtUser = yield UserDB.buildUser(user, opts, tenantId, dbUser);
|
|
231
|
+
// don't allow a user to update its own roles/perms
|
|
232
|
+
if (opts.currentUserId && opts.currentUserId === (dbUser === null || dbUser === void 0 ? void 0 : dbUser._id)) {
|
|
233
|
+
builtUser = usersCore.cleanseUserObject(builtUser, dbUser);
|
|
234
|
+
}
|
|
235
|
+
if (!dbUser && (roles === null || roles === void 0 ? void 0 : roles.length)) {
|
|
236
|
+
builtUser.roles = Object.assign({}, roles);
|
|
237
|
+
}
|
|
238
|
+
// make sure we set the _id field for a new user
|
|
239
|
+
// Also if this is a new user, associate groups with them
|
|
240
|
+
let groupPromises = [];
|
|
241
|
+
if (!_id) {
|
|
242
|
+
_id = builtUser._id;
|
|
243
|
+
if (userGroups.length > 0) {
|
|
244
|
+
for (let groupId of userGroups) {
|
|
245
|
+
groupPromises.push(UserDB.groups.addUsers(groupId, [_id]));
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
try {
|
|
250
|
+
// save the user to db
|
|
251
|
+
let response = yield db.put(builtUser);
|
|
252
|
+
builtUser._rev = response.rev;
|
|
253
|
+
yield eventHelpers.handleSaveEvents(builtUser, dbUser);
|
|
254
|
+
yield platform.users.addUser(tenantId, builtUser._id, builtUser.email);
|
|
255
|
+
yield cache.user.invalidateUser(response.id);
|
|
256
|
+
yield Promise.all(groupPromises);
|
|
257
|
+
// finally returned the saved user from the db
|
|
258
|
+
return db.get(builtUser._id);
|
|
259
|
+
}
|
|
260
|
+
catch (err) {
|
|
261
|
+
if (err.status === 409) {
|
|
262
|
+
throw "User exists already";
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
throw err;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}));
|
|
269
|
+
});
|
|
190
270
|
}
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
271
|
+
static bulkCreate(newUsersRequested, groups) {
|
|
272
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
273
|
+
const tenantId = (0, context_1.getTenantId)();
|
|
274
|
+
let usersToSave = [];
|
|
275
|
+
let newUsers = [];
|
|
276
|
+
const emails = newUsersRequested.map((user) => user.email);
|
|
277
|
+
const existingEmails = yield (0, lookup_1.searchExistingEmails)(emails);
|
|
278
|
+
const unsuccessful = [];
|
|
279
|
+
for (const newUser of newUsersRequested) {
|
|
280
|
+
if (newUsers.find((x) => x.email.toLowerCase() === newUser.email.toLowerCase()) ||
|
|
281
|
+
existingEmails.includes(newUser.email.toLowerCase())) {
|
|
282
|
+
unsuccessful.push({
|
|
283
|
+
email: newUser.email,
|
|
284
|
+
reason: `Unavailable`,
|
|
285
|
+
});
|
|
286
|
+
continue;
|
|
287
|
+
}
|
|
288
|
+
newUser.userGroups = groups;
|
|
289
|
+
newUsers.push(newUser);
|
|
290
|
+
}
|
|
291
|
+
const account = yield accountSdk.getAccountByTenantId(tenantId);
|
|
292
|
+
return UserDB.quotas.addUsers(newUsers.length, () => __awaiter(this, void 0, void 0, function* () {
|
|
293
|
+
// create the promises array that will be called by bulkDocs
|
|
294
|
+
newUsers.forEach((user) => {
|
|
295
|
+
usersToSave.push(UserDB.buildUser(user, {
|
|
296
|
+
hashPassword: true,
|
|
297
|
+
requirePassword: user.requirePassword,
|
|
298
|
+
}, tenantId, undefined, // no dbUser
|
|
299
|
+
account));
|
|
300
|
+
});
|
|
301
|
+
const usersToBulkSave = yield Promise.all(usersToSave);
|
|
302
|
+
yield usersCore.bulkUpdateGlobalUsers(usersToBulkSave);
|
|
303
|
+
// Post-processing of bulk added users, e.g. events and cache operations
|
|
304
|
+
for (const user of usersToBulkSave) {
|
|
305
|
+
// TODO: Refactor to bulk insert users into the info db
|
|
306
|
+
// instead of relying on looping tenant creation
|
|
307
|
+
yield platform.users.addUser(tenantId, user._id, user.email);
|
|
308
|
+
yield eventHelpers.handleSaveEvents(user, undefined);
|
|
309
|
+
}
|
|
310
|
+
const saved = usersToBulkSave.map(user => {
|
|
311
|
+
return {
|
|
312
|
+
_id: user._id,
|
|
313
|
+
email: user.email,
|
|
314
|
+
};
|
|
315
|
+
});
|
|
316
|
+
// now update the groups
|
|
317
|
+
if (Array.isArray(saved) && groups) {
|
|
318
|
+
const groupPromises = [];
|
|
319
|
+
const createdUserIds = saved.map(user => user._id);
|
|
320
|
+
for (let groupId of groups) {
|
|
321
|
+
groupPromises.push(UserDB.groups.addUsers(groupId, createdUserIds));
|
|
322
|
+
}
|
|
323
|
+
yield Promise.all(groupPromises);
|
|
324
|
+
}
|
|
325
|
+
return {
|
|
326
|
+
successful: saved,
|
|
327
|
+
unsuccessful,
|
|
328
|
+
};
|
|
329
|
+
}));
|
|
330
|
+
});
|
|
196
331
|
}
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
332
|
+
static bulkDelete(userIds) {
|
|
333
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
334
|
+
const db = (0, context_1.getGlobalDB)();
|
|
335
|
+
const response = {
|
|
336
|
+
successful: [],
|
|
337
|
+
unsuccessful: [],
|
|
338
|
+
};
|
|
339
|
+
// remove the account holder from the delete request if present
|
|
340
|
+
const account = yield (0, utils_1.getAccountHolderFromUserIds)(userIds);
|
|
341
|
+
if (account) {
|
|
342
|
+
userIds = userIds.filter(u => u !== account.budibaseUserId);
|
|
343
|
+
// mark user as unsuccessful
|
|
344
|
+
response.unsuccessful.push({
|
|
345
|
+
_id: account.budibaseUserId,
|
|
346
|
+
email: account.email,
|
|
347
|
+
reason: "Account holder cannot be deleted",
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
// Get users and delete
|
|
351
|
+
const allDocsResponse = yield db.allDocs({
|
|
352
|
+
include_docs: true,
|
|
353
|
+
keys: userIds,
|
|
354
|
+
});
|
|
355
|
+
const usersToDelete = allDocsResponse.rows.map((user) => {
|
|
356
|
+
return user.doc;
|
|
357
|
+
});
|
|
358
|
+
// Delete from DB
|
|
359
|
+
const toDelete = usersToDelete.map(user => (Object.assign(Object.assign({}, user), { _deleted: true })));
|
|
360
|
+
const dbResponse = yield usersCore.bulkUpdateGlobalUsers(toDelete);
|
|
361
|
+
yield UserDB.quotas.removeUsers(toDelete.length);
|
|
362
|
+
for (let user of usersToDelete) {
|
|
363
|
+
yield bulkDeleteProcessing(user);
|
|
364
|
+
}
|
|
365
|
+
// Build Response
|
|
366
|
+
// index users by id
|
|
367
|
+
const userIndex = {};
|
|
368
|
+
usersToDelete.reduce((prev, current) => {
|
|
369
|
+
prev[current._id] = current;
|
|
370
|
+
return prev;
|
|
371
|
+
}, userIndex);
|
|
372
|
+
// add the successful and unsuccessful users to response
|
|
373
|
+
dbResponse.forEach(item => {
|
|
374
|
+
const email = userIndex[item.id].email;
|
|
375
|
+
if (item.ok) {
|
|
376
|
+
response.successful.push({ _id: item.id, email });
|
|
377
|
+
}
|
|
378
|
+
else {
|
|
379
|
+
response.unsuccessful.push({
|
|
380
|
+
_id: item.id,
|
|
381
|
+
email,
|
|
382
|
+
reason: "Database error",
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
});
|
|
386
|
+
return response;
|
|
247
387
|
});
|
|
248
|
-
continue;
|
|
249
|
-
}
|
|
250
|
-
newUser.userGroups = groups;
|
|
251
|
-
newUsers.push(newUser);
|
|
252
388
|
}
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
_id: user._id,
|
|
279
|
-
email: user.email
|
|
280
|
-
};
|
|
281
|
-
});
|
|
282
|
-
if (Array.isArray(saved) && groups) {
|
|
283
|
-
const groupPromises = [];
|
|
284
|
-
const createdUserIds = saved.map((user) => user._id);
|
|
285
|
-
for (let groupId of groups) {
|
|
286
|
-
groupPromises.push(UserDB.groups.addUsers(groupId, createdUserIds));
|
|
287
|
-
}
|
|
288
|
-
await Promise.all(groupPromises);
|
|
289
|
-
}
|
|
290
|
-
return {
|
|
291
|
-
successful: saved,
|
|
292
|
-
unsuccessful
|
|
293
|
-
};
|
|
294
|
-
});
|
|
295
|
-
}
|
|
296
|
-
static async bulkDelete(userIds) {
|
|
297
|
-
const db = (0, import_context.getGlobalDB)();
|
|
298
|
-
const response = {
|
|
299
|
-
successful: [],
|
|
300
|
-
unsuccessful: []
|
|
301
|
-
};
|
|
302
|
-
const account = await (0, import_utils.getAccountHolderFromUserIds)(userIds);
|
|
303
|
-
if (account) {
|
|
304
|
-
userIds = userIds.filter((u) => u !== account.budibaseUserId);
|
|
305
|
-
response.unsuccessful.push({
|
|
306
|
-
_id: account.budibaseUserId,
|
|
307
|
-
email: account.email,
|
|
308
|
-
reason: "Account holder cannot be deleted"
|
|
309
|
-
});
|
|
389
|
+
static destroy(id) {
|
|
390
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
391
|
+
const db = (0, context_1.getGlobalDB)();
|
|
392
|
+
const dbUser = (yield db.get(id));
|
|
393
|
+
const userId = dbUser._id;
|
|
394
|
+
if (!environment_1.default.SELF_HOSTED && !environment_1.default.DISABLE_ACCOUNT_PORTAL) {
|
|
395
|
+
// root account holder can't be deleted from inside budibase
|
|
396
|
+
const email = dbUser.email;
|
|
397
|
+
const account = yield accounts.getAccount(email);
|
|
398
|
+
if (account) {
|
|
399
|
+
if (dbUser.userId === (0, context_1.getIdentity)()._id) {
|
|
400
|
+
throw new errors_1.HTTPError('Please visit "Account" to delete this user', 400);
|
|
401
|
+
}
|
|
402
|
+
else {
|
|
403
|
+
throw new errors_1.HTTPError("Account holder cannot be deleted", 400);
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
yield platform.users.removeUser(dbUser);
|
|
408
|
+
yield db.remove(userId, dbUser._rev);
|
|
409
|
+
yield UserDB.quotas.removeUsers(1);
|
|
410
|
+
yield eventHelpers.handleDeleteEvents(dbUser);
|
|
411
|
+
yield cache.user.invalidateUser(userId);
|
|
412
|
+
yield sessions.invalidateSessions(userId, { reason: "deletion" });
|
|
413
|
+
});
|
|
310
414
|
}
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
const usersToDelete = allDocsResponse.rows.map(
|
|
316
|
-
(user) => {
|
|
317
|
-
return user.doc;
|
|
318
|
-
}
|
|
319
|
-
);
|
|
320
|
-
const toDelete = usersToDelete.map((user) => ({
|
|
321
|
-
...user,
|
|
322
|
-
_deleted: true
|
|
323
|
-
}));
|
|
324
|
-
const dbResponse = await usersCore.bulkUpdateGlobalUsers(toDelete);
|
|
325
|
-
await UserDB.quotas.removeUsers(toDelete.length);
|
|
326
|
-
for (let user of usersToDelete) {
|
|
327
|
-
await bulkDeleteProcessing(user);
|
|
415
|
+
static getGroups(groupIds) {
|
|
416
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
417
|
+
return yield this.groups.getBulk(groupIds);
|
|
418
|
+
});
|
|
328
419
|
}
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
return prev;
|
|
333
|
-
}, userIndex);
|
|
334
|
-
dbResponse.forEach((item) => {
|
|
335
|
-
const email = userIndex[item.id].email;
|
|
336
|
-
if (item.ok) {
|
|
337
|
-
response.successful.push({ _id: item.id, email });
|
|
338
|
-
} else {
|
|
339
|
-
response.unsuccessful.push({
|
|
340
|
-
_id: item.id,
|
|
341
|
-
email,
|
|
342
|
-
reason: "Database error"
|
|
420
|
+
static getGroupBuilderAppIds(user) {
|
|
421
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
422
|
+
return yield this.groups.getGroupBuilderAppIds(user);
|
|
343
423
|
});
|
|
344
|
-
}
|
|
345
|
-
});
|
|
346
|
-
return response;
|
|
347
|
-
}
|
|
348
|
-
static async destroy(id) {
|
|
349
|
-
const db = (0, import_context.getGlobalDB)();
|
|
350
|
-
const dbUser = await db.get(id);
|
|
351
|
-
const userId = dbUser._id;
|
|
352
|
-
if (!import_environment.default.SELF_HOSTED && !import_environment.default.DISABLE_ACCOUNT_PORTAL) {
|
|
353
|
-
const email = dbUser.email;
|
|
354
|
-
const account = await accounts.getAccount(email);
|
|
355
|
-
if (account) {
|
|
356
|
-
if (dbUser.userId === (0, import_context.getIdentity)()._id) {
|
|
357
|
-
throw new import_errors.HTTPError('Please visit "Account" to delete this user', 400);
|
|
358
|
-
} else {
|
|
359
|
-
throw new import_errors.HTTPError("Account holder cannot be deleted", 400);
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
424
|
}
|
|
363
|
-
await platform.users.removeUser(dbUser);
|
|
364
|
-
await db.remove(userId, dbUser._rev);
|
|
365
|
-
await UserDB.quotas.removeUsers(1);
|
|
366
|
-
await eventHelpers.handleDeleteEvents(dbUser);
|
|
367
|
-
await cache.user.invalidateUser(userId);
|
|
368
|
-
await sessions.invalidateSessions(userId, { reason: "deletion" });
|
|
369
|
-
}
|
|
370
|
-
static async getGroups(groupIds) {
|
|
371
|
-
return await this.groups.getBulk(groupIds);
|
|
372
|
-
}
|
|
373
|
-
static async getGroupBuilderAppIds(user) {
|
|
374
|
-
return await this.groups.getGroupBuilderAppIds(user);
|
|
375
|
-
}
|
|
376
425
|
}
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
UserDB
|
|
380
|
-
});
|
|
381
|
-
//# sourceMappingURL=db.js.map
|
|
426
|
+
exports.UserDB = UserDB;
|
|
427
|
+
//# sourceMappingURL=db.js.map
|