@decaf-ts/integrations 0.11.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +164 -0
- package/dist/integrations.cjs +1 -1
- package/dist/integrations.cjs.map +1 -1
- package/dist/integrations.js +1 -1
- package/dist/integrations.js.map +1 -1
- package/docker/mailpit-compose.yml +17 -0
- package/docker/postgres-compose.yml +26 -0
- package/lib/cjs/blob/azure/AzureBlobStoreService.cjs +12 -23
- package/lib/cjs/blob/azure/AzureBlobStoreService.cjs.map +1 -1
- package/lib/cjs/blob/core/BlobStoreService.cjs +26 -25
- package/lib/cjs/blob/core/BlobStoreService.cjs.map +1 -1
- package/lib/cjs/blob/gcp/GcsBlobStoreService.cjs +12 -23
- package/lib/cjs/blob/gcp/GcsBlobStoreService.cjs.map +1 -1
- package/lib/cjs/blob/s3/S3BlobStoreService.cjs +11 -16
- package/lib/cjs/blob/s3/S3BlobStoreService.cjs.map +1 -1
- package/lib/cjs/blob/s3/S3CompatibleBlobStoreService.cjs +14 -16
- package/lib/cjs/blob/s3/S3CompatibleBlobStoreService.cjs.map +1 -1
- package/lib/cjs/comms/email/EmailService.cjs +376 -0
- package/lib/cjs/comms/email/EmailService.cjs.map +1 -0
- package/lib/cjs/comms/email/index.cjs +29 -0
- package/lib/cjs/comms/email/index.cjs.map +1 -0
- package/lib/cjs/comms/email/mime.cjs +225 -0
- package/lib/cjs/comms/email/mime.cjs.map +1 -0
- package/lib/cjs/comms/email/smtp.cjs +204 -0
- package/lib/cjs/comms/email/smtp.cjs.map +1 -0
- package/lib/cjs/comms/environment.cjs +63 -0
- package/lib/cjs/comms/environment.cjs.map +1 -0
- package/lib/cjs/comms/gmail/GmailService.cjs +235 -0
- package/lib/cjs/comms/gmail/GmailService.cjs.map +1 -0
- package/lib/cjs/comms/gmail/index.cjs +24 -0
- package/lib/cjs/comms/gmail/index.cjs.map +1 -0
- package/lib/cjs/comms/index.cjs +31 -0
- package/lib/cjs/comms/index.cjs.map +1 -0
- package/lib/cjs/comms/slack/SlackService.cjs +264 -0
- package/lib/cjs/comms/slack/SlackService.cjs.map +1 -0
- package/lib/cjs/comms/slack/index.cjs +24 -0
- package/lib/cjs/comms/slack/index.cjs.map +1 -0
- package/lib/cjs/comms/teams/TeamsService.cjs +212 -0
- package/lib/cjs/comms/teams/TeamsService.cjs.map +1 -0
- package/lib/cjs/comms/teams/index.cjs +24 -0
- package/lib/cjs/comms/teams/index.cjs.map +1 -0
- package/lib/cjs/comms/telegram/TelegramService.cjs +196 -0
- package/lib/cjs/comms/telegram/TelegramService.cjs.map +1 -0
- package/lib/cjs/comms/telegram/index.cjs +24 -0
- package/lib/cjs/comms/telegram/index.cjs.map +1 -0
- package/lib/cjs/devops/environment.cjs +43 -0
- package/lib/cjs/devops/environment.cjs.map +1 -0
- package/lib/cjs/devops/github/GithubService.cjs +302 -0
- package/lib/cjs/devops/github/GithubService.cjs.map +1 -0
- package/lib/cjs/devops/github/index.cjs +24 -0
- package/lib/cjs/devops/github/index.cjs.map +1 -0
- package/lib/cjs/devops/gitlab/GitlabService.cjs +282 -0
- package/lib/cjs/devops/gitlab/GitlabService.cjs.map +1 -0
- package/lib/cjs/devops/gitlab/index.cjs +24 -0
- package/lib/cjs/devops/gitlab/index.cjs.map +1 -0
- package/lib/cjs/devops/index.cjs +28 -0
- package/lib/cjs/devops/index.cjs.map +1 -0
- package/lib/cjs/feature-flags/models/FeatureFlag.model.cjs +2 -0
- package/lib/cjs/feature-flags/models/FeatureFlag.model.cjs.map +1 -1
- package/lib/cjs/feature-flags/models/FeatureFlagAccess.model.cjs +2 -0
- package/lib/cjs/feature-flags/models/FeatureFlagAccess.model.cjs.map +1 -1
- package/lib/cjs/index.cjs +3 -3
- package/lib/cjs/io/airtable/AirtableService.cjs +266 -0
- package/lib/cjs/io/airtable/AirtableService.cjs.map +1 -0
- package/lib/cjs/io/airtable/index.cjs +24 -0
- package/lib/cjs/io/airtable/index.cjs.map +1 -0
- package/lib/cjs/io/environment.cjs +46 -0
- package/lib/cjs/io/environment.cjs.map +1 -0
- package/lib/cjs/io/google-sheets/GoogleSheetsService.cjs +288 -0
- package/lib/cjs/io/google-sheets/GoogleSheetsService.cjs.map +1 -0
- package/lib/cjs/io/google-sheets/index.cjs +24 -0
- package/lib/cjs/io/google-sheets/index.cjs.map +1 -0
- package/lib/cjs/io/graphql/GraphqlService.cjs +143 -0
- package/lib/cjs/io/graphql/GraphqlService.cjs.map +1 -0
- package/lib/cjs/io/graphql/index.cjs +24 -0
- package/lib/cjs/io/graphql/index.cjs.map +1 -0
- package/lib/cjs/io/index.cjs +30 -0
- package/lib/cjs/io/index.cjs.map +1 -0
- package/lib/cjs/io/spreadsheet/SpreadsheetService.cjs +205 -0
- package/lib/cjs/io/spreadsheet/SpreadsheetService.cjs.map +1 -0
- package/lib/cjs/io/spreadsheet/index.cjs +25 -0
- package/lib/cjs/io/spreadsheet/index.cjs.map +1 -0
- package/lib/cjs/namespaces/index.cjs +1 -0
- package/lib/cjs/namespaces/index.cjs.map +1 -1
- package/lib/cjs/namespaces/models/credential.model.cjs +115 -0
- package/lib/cjs/namespaces/models/credential.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/effective-permission.model.cjs +2 -0
- package/lib/cjs/namespaces/models/effective-permission.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/group-membership.model.cjs +2 -0
- package/lib/cjs/namespaces/models/group-membership.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/group.model.cjs +2 -0
- package/lib/cjs/namespaces/models/group.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/index.cjs +1 -0
- package/lib/cjs/namespaces/models/index.cjs.map +1 -1
- package/lib/cjs/namespaces/models/inheritance-block.model.cjs +2 -0
- package/lib/cjs/namespaces/models/inheritance-block.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/org-unit-closure.model.cjs +2 -0
- package/lib/cjs/namespaces/models/org-unit-closure.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/org-unit-membership.model.cjs +2 -0
- package/lib/cjs/namespaces/models/org-unit-membership.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/org-unit-profile.model.cjs +2 -0
- package/lib/cjs/namespaces/models/org-unit-profile.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/org-unit.model.cjs +2 -0
- package/lib/cjs/namespaces/models/org-unit.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/permission.model.cjs +2 -0
- package/lib/cjs/namespaces/models/permission.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/principal.model.cjs +2 -0
- package/lib/cjs/namespaces/models/principal.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/protected-resource.model.cjs +2 -0
- package/lib/cjs/namespaces/models/protected-resource.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/resource-grant.model.cjs +2 -0
- package/lib/cjs/namespaces/models/resource-grant.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/role-assignment.model.cjs +2 -0
- package/lib/cjs/namespaces/models/role-assignment.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/role-permission.model.cjs +2 -0
- package/lib/cjs/namespaces/models/role-permission.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/role.model.cjs +2 -0
- package/lib/cjs/namespaces/models/role.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/storage-binding.model.cjs +2 -0
- package/lib/cjs/namespaces/models/storage-binding.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/tenant-membership.model.cjs +2 -0
- package/lib/cjs/namespaces/models/tenant-membership.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/tenant-profile.model.cjs +2 -0
- package/lib/cjs/namespaces/models/tenant-profile.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/tenant.model.cjs +2 -0
- package/lib/cjs/namespaces/models/tenant.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/user.model.cjs +2 -0
- package/lib/cjs/namespaces/models/user.model.cjs.map +1 -1
- package/lib/cjs/namespaces/rls/index.cjs +28 -0
- package/lib/cjs/namespaces/rls/index.cjs.map +1 -0
- package/lib/cjs/namespaces/rls/principal-resolver.cjs +66 -0
- package/lib/cjs/namespaces/rls/principal-resolver.cjs.map +1 -0
- package/lib/cjs/namespaces/rls/rls-bootstrap.service.cjs +269 -0
- package/lib/cjs/namespaces/rls/rls-bootstrap.service.cjs.map +1 -0
- package/lib/cjs/namespaces/rls/rls.constants.cjs +79 -0
- package/lib/cjs/namespaces/rls/rls.constants.cjs.map +1 -0
- package/lib/cjs/namespaces/rls/rls.template.cjs +719 -0
- package/lib/cjs/namespaces/rls/rls.template.cjs.map +1 -0
- package/lib/cjs/namespaces/rls/rls.types.cjs +4 -0
- package/lib/cjs/namespaces/rls/rls.types.cjs.map +1 -0
- package/lib/cjs/namespaces/rls/session-binding.cjs +70 -0
- package/lib/cjs/namespaces/rls/session-binding.cjs.map +1 -0
- package/lib/cjs/namespaces/services/credential.service.cjs +327 -0
- package/lib/cjs/namespaces/services/credential.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/index.cjs +1 -0
- package/lib/cjs/namespaces/services/index.cjs.map +1 -1
- package/lib/cjs/namespaces/types.cjs +6 -1
- package/lib/cjs/namespaces/types.cjs.map +1 -1
- package/lib/cjs/redis/adapter.cjs +7 -1
- package/lib/cjs/redis/adapter.cjs.map +1 -1
- package/lib/cjs/secrets/InfraCredentialBootstrap.cjs +80 -0
- package/lib/cjs/secrets/InfraCredentialBootstrap.cjs.map +1 -0
- package/lib/cjs/secrets/aws/AwsSecretService.cjs +2 -15
- package/lib/cjs/secrets/aws/AwsSecretService.cjs.map +1 -1
- package/lib/cjs/secrets/azure/AzureKeyVaultSecretService.cjs +2 -16
- package/lib/cjs/secrets/azure/AzureKeyVaultSecretService.cjs.map +1 -1
- package/lib/cjs/secrets/core/SecretReference.cjs +1 -0
- package/lib/cjs/secrets/core/SecretReference.cjs.map +1 -1
- package/lib/cjs/secrets/fs/FsSecretEnvironment.cjs +28 -0
- package/lib/cjs/secrets/fs/FsSecretEnvironment.cjs.map +1 -0
- package/lib/cjs/secrets/fs/FsSecretService.cjs +420 -0
- package/lib/cjs/secrets/fs/FsSecretService.cjs.map +1 -0
- package/lib/cjs/secrets/fs/FsSecretServiceConfig.cjs +25 -0
- package/lib/cjs/secrets/fs/FsSecretServiceConfig.cjs.map +1 -0
- package/lib/cjs/secrets/fs/index.cjs +27 -0
- package/lib/cjs/secrets/fs/index.cjs.map +1 -0
- package/lib/cjs/secrets/gcp/GcpSecretManagerService.cjs +2 -16
- package/lib/cjs/secrets/gcp/GcpSecretManagerService.cjs.map +1 -1
- package/lib/cjs/secrets/index.cjs +2 -0
- package/lib/cjs/secrets/index.cjs.map +1 -1
- package/lib/cjs/secrets/model/ModelSecretService.cjs +335 -43
- package/lib/cjs/secrets/model/ModelSecretService.cjs.map +1 -1
- package/lib/cjs/secrets/model/Secret.cjs +83 -5
- package/lib/cjs/secrets/model/Secret.cjs.map +1 -1
- package/lib/cjs/secrets/onepassword/OnePasswordSecretService.cjs +2 -16
- package/lib/cjs/secrets/onepassword/OnePasswordSecretService.cjs.map +1 -1
- package/lib/cjs/secrets/vault/VaultSecretService.cjs +2 -16
- package/lib/cjs/secrets/vault/VaultSecretService.cjs.map +1 -1
- package/lib/cjs/shared/environmentValue.cjs +24 -0
- package/lib/cjs/shared/environmentValue.cjs.map +1 -1
- package/lib/cjs/shared/http/HttpApiService.cjs +190 -0
- package/lib/cjs/shared/http/HttpApiService.cjs.map +1 -0
- package/lib/cjs/shared/http/hermeticBoot.cjs +150 -0
- package/lib/cjs/shared/http/hermeticBoot.cjs.map +1 -0
- package/lib/cjs/shared/http/index.cjs +28 -0
- package/lib/cjs/shared/http/index.cjs.map +1 -0
- package/lib/esm/blob/azure/AzureBlobStoreService.js +13 -21
- package/lib/esm/blob/azure/AzureBlobStoreService.js.map +1 -1
- package/lib/esm/blob/core/BlobStoreService.js +26 -25
- package/lib/esm/blob/core/BlobStoreService.js.map +1 -1
- package/lib/esm/blob/gcp/GcsBlobStoreService.js +13 -21
- package/lib/esm/blob/gcp/GcsBlobStoreService.js.map +1 -1
- package/lib/esm/blob/s3/S3BlobStoreService.js +12 -14
- package/lib/esm/blob/s3/S3BlobStoreService.js.map +1 -1
- package/lib/esm/blob/s3/S3CompatibleBlobStoreService.js +14 -16
- package/lib/esm/blob/s3/S3CompatibleBlobStoreService.js.map +1 -1
- package/lib/esm/comms/email/EmailService.js +338 -0
- package/lib/esm/comms/email/EmailService.js.map +1 -0
- package/lib/esm/comms/email/index.js +12 -0
- package/lib/esm/comms/email/index.js.map +1 -0
- package/lib/esm/comms/email/mime.js +218 -0
- package/lib/esm/comms/email/mime.js.map +1 -0
- package/lib/esm/comms/email/smtp.js +166 -0
- package/lib/esm/comms/email/smtp.js.map +1 -0
- package/lib/esm/comms/environment.js +59 -0
- package/lib/esm/comms/environment.js.map +1 -0
- package/lib/esm/comms/gmail/GmailService.js +230 -0
- package/lib/esm/comms/gmail/GmailService.js.map +1 -0
- package/lib/esm/comms/gmail/index.js +7 -0
- package/lib/esm/comms/gmail/index.js.map +1 -0
- package/lib/esm/comms/index.js +14 -0
- package/lib/esm/comms/index.js.map +1 -0
- package/lib/esm/comms/slack/SlackService.js +259 -0
- package/lib/esm/comms/slack/SlackService.js.map +1 -0
- package/lib/esm/comms/slack/index.js +7 -0
- package/lib/esm/comms/slack/index.js.map +1 -0
- package/lib/esm/comms/teams/TeamsService.js +204 -0
- package/lib/esm/comms/teams/TeamsService.js.map +1 -0
- package/lib/esm/comms/teams/index.js +7 -0
- package/lib/esm/comms/teams/index.js.map +1 -0
- package/lib/esm/comms/telegram/TelegramService.js +191 -0
- package/lib/esm/comms/telegram/TelegramService.js.map +1 -0
- package/lib/esm/comms/telegram/index.js +7 -0
- package/lib/esm/comms/telegram/index.js.map +1 -0
- package/lib/esm/devops/environment.js +39 -0
- package/lib/esm/devops/environment.js.map +1 -0
- package/lib/esm/devops/github/GithubService.js +297 -0
- package/lib/esm/devops/github/GithubService.js.map +1 -0
- package/lib/esm/devops/github/index.js +7 -0
- package/lib/esm/devops/github/index.js.map +1 -0
- package/lib/esm/devops/gitlab/GitlabService.js +277 -0
- package/lib/esm/devops/gitlab/GitlabService.js.map +1 -0
- package/lib/esm/devops/gitlab/index.js +7 -0
- package/lib/esm/devops/gitlab/index.js.map +1 -0
- package/lib/esm/devops/index.js +11 -0
- package/lib/esm/devops/index.js.map +1 -0
- package/lib/esm/feature-flags/models/FeatureFlag.model.js +2 -0
- package/lib/esm/feature-flags/models/FeatureFlag.model.js.map +1 -1
- package/lib/esm/feature-flags/models/FeatureFlagAccess.model.js +2 -0
- package/lib/esm/feature-flags/models/FeatureFlagAccess.model.js.map +1 -1
- package/lib/esm/index.js +3 -3
- package/lib/esm/io/airtable/AirtableService.js +261 -0
- package/lib/esm/io/airtable/AirtableService.js.map +1 -0
- package/lib/esm/io/airtable/index.js +7 -0
- package/lib/esm/io/airtable/index.js.map +1 -0
- package/lib/esm/io/environment.js +42 -0
- package/lib/esm/io/environment.js.map +1 -0
- package/lib/esm/io/google-sheets/GoogleSheetsService.js +283 -0
- package/lib/esm/io/google-sheets/GoogleSheetsService.js.map +1 -0
- package/lib/esm/io/google-sheets/index.js +7 -0
- package/lib/esm/io/google-sheets/index.js.map +1 -0
- package/lib/esm/io/graphql/GraphqlService.js +138 -0
- package/lib/esm/io/graphql/GraphqlService.js.map +1 -0
- package/lib/esm/io/graphql/index.js +7 -0
- package/lib/esm/io/graphql/index.js.map +1 -0
- package/lib/esm/io/index.js +13 -0
- package/lib/esm/io/index.js.map +1 -0
- package/lib/esm/io/spreadsheet/SpreadsheetService.js +200 -0
- package/lib/esm/io/spreadsheet/SpreadsheetService.js.map +1 -0
- package/lib/esm/io/spreadsheet/index.js +8 -0
- package/lib/esm/io/spreadsheet/index.js.map +1 -0
- package/lib/esm/namespaces/index.js +1 -0
- package/lib/esm/namespaces/index.js.map +1 -1
- package/lib/esm/namespaces/models/credential.model.js +106 -0
- package/lib/esm/namespaces/models/credential.model.js.map +1 -0
- package/lib/esm/namespaces/models/effective-permission.model.js +2 -0
- package/lib/esm/namespaces/models/effective-permission.model.js.map +1 -1
- package/lib/esm/namespaces/models/group-membership.model.js +2 -0
- package/lib/esm/namespaces/models/group-membership.model.js.map +1 -1
- package/lib/esm/namespaces/models/group.model.js +2 -0
- package/lib/esm/namespaces/models/group.model.js.map +1 -1
- package/lib/esm/namespaces/models/index.js +1 -0
- package/lib/esm/namespaces/models/index.js.map +1 -1
- package/lib/esm/namespaces/models/inheritance-block.model.js +2 -0
- package/lib/esm/namespaces/models/inheritance-block.model.js.map +1 -1
- package/lib/esm/namespaces/models/org-unit-closure.model.js +2 -0
- package/lib/esm/namespaces/models/org-unit-closure.model.js.map +1 -1
- package/lib/esm/namespaces/models/org-unit-membership.model.js +2 -0
- package/lib/esm/namespaces/models/org-unit-membership.model.js.map +1 -1
- package/lib/esm/namespaces/models/org-unit-profile.model.js +2 -0
- package/lib/esm/namespaces/models/org-unit-profile.model.js.map +1 -1
- package/lib/esm/namespaces/models/org-unit.model.js +2 -0
- package/lib/esm/namespaces/models/org-unit.model.js.map +1 -1
- package/lib/esm/namespaces/models/permission.model.js +2 -0
- package/lib/esm/namespaces/models/permission.model.js.map +1 -1
- package/lib/esm/namespaces/models/principal.model.js +2 -0
- package/lib/esm/namespaces/models/principal.model.js.map +1 -1
- package/lib/esm/namespaces/models/protected-resource.model.js +2 -0
- package/lib/esm/namespaces/models/protected-resource.model.js.map +1 -1
- package/lib/esm/namespaces/models/resource-grant.model.js +2 -0
- package/lib/esm/namespaces/models/resource-grant.model.js.map +1 -1
- package/lib/esm/namespaces/models/role-assignment.model.js +2 -0
- package/lib/esm/namespaces/models/role-assignment.model.js.map +1 -1
- package/lib/esm/namespaces/models/role-permission.model.js +2 -0
- package/lib/esm/namespaces/models/role-permission.model.js.map +1 -1
- package/lib/esm/namespaces/models/role.model.js +2 -0
- package/lib/esm/namespaces/models/role.model.js.map +1 -1
- package/lib/esm/namespaces/models/storage-binding.model.js +2 -0
- package/lib/esm/namespaces/models/storage-binding.model.js.map +1 -1
- package/lib/esm/namespaces/models/tenant-membership.model.js +2 -0
- package/lib/esm/namespaces/models/tenant-membership.model.js.map +1 -1
- package/lib/esm/namespaces/models/tenant-profile.model.js +2 -0
- package/lib/esm/namespaces/models/tenant-profile.model.js.map +1 -1
- package/lib/esm/namespaces/models/tenant.model.js +2 -0
- package/lib/esm/namespaces/models/tenant.model.js.map +1 -1
- package/lib/esm/namespaces/models/user.model.js +2 -0
- package/lib/esm/namespaces/models/user.model.js.map +1 -1
- package/lib/esm/namespaces/rls/index.js +11 -0
- package/lib/esm/namespaces/rls/index.js.map +1 -0
- package/lib/esm/namespaces/rls/principal-resolver.js +61 -0
- package/lib/esm/namespaces/rls/principal-resolver.js.map +1 -0
- package/lib/esm/namespaces/rls/rls-bootstrap.service.js +261 -0
- package/lib/esm/namespaces/rls/rls-bootstrap.service.js.map +1 -0
- package/lib/esm/namespaces/rls/rls.constants.js +75 -0
- package/lib/esm/namespaces/rls/rls.constants.js.map +1 -0
- package/lib/esm/namespaces/rls/rls.template.js +711 -0
- package/lib/esm/namespaces/rls/rls.template.js.map +1 -0
- package/lib/esm/namespaces/rls/rls.types.js +9 -0
- package/lib/esm/namespaces/rls/rls.types.js.map +1 -0
- package/lib/esm/namespaces/rls/session-binding.js +65 -0
- package/lib/esm/namespaces/rls/session-binding.js.map +1 -0
- package/lib/esm/namespaces/services/credential.service.js +322 -0
- package/lib/esm/namespaces/services/credential.service.js.map +1 -0
- package/lib/esm/namespaces/services/index.js +1 -0
- package/lib/esm/namespaces/services/index.js.map +1 -1
- package/lib/esm/namespaces/types.js +6 -0
- package/lib/esm/namespaces/types.js.map +1 -1
- package/lib/esm/redis/adapter.js +7 -1
- package/lib/esm/redis/adapter.js.map +1 -1
- package/lib/esm/secrets/InfraCredentialBootstrap.js +74 -0
- package/lib/esm/secrets/InfraCredentialBootstrap.js.map +1 -0
- package/lib/esm/secrets/aws/AwsSecretService.js +3 -13
- package/lib/esm/secrets/aws/AwsSecretService.js.map +1 -1
- package/lib/esm/secrets/azure/AzureKeyVaultSecretService.js +2 -13
- package/lib/esm/secrets/azure/AzureKeyVaultSecretService.js.map +1 -1
- package/lib/esm/secrets/core/SecretReference.js +1 -0
- package/lib/esm/secrets/core/SecretReference.js.map +1 -1
- package/lib/esm/secrets/fs/FsSecretEnvironment.js +24 -0
- package/lib/esm/secrets/fs/FsSecretEnvironment.js.map +1 -0
- package/lib/esm/secrets/fs/FsSecretService.js +412 -0
- package/lib/esm/secrets/fs/FsSecretService.js.map +1 -0
- package/lib/esm/secrets/fs/FsSecretServiceConfig.js +21 -0
- package/lib/esm/secrets/fs/FsSecretServiceConfig.js.map +1 -0
- package/lib/esm/secrets/fs/index.js +10 -0
- package/lib/esm/secrets/fs/index.js.map +1 -0
- package/lib/esm/secrets/gcp/GcpSecretManagerService.js +2 -13
- package/lib/esm/secrets/gcp/GcpSecretManagerService.js.map +1 -1
- package/lib/esm/secrets/index.js +2 -0
- package/lib/esm/secrets/index.js.map +1 -1
- package/lib/esm/secrets/model/ModelSecretService.js +337 -42
- package/lib/esm/secrets/model/ModelSecretService.js.map +1 -1
- package/lib/esm/secrets/model/Secret.js +86 -7
- package/lib/esm/secrets/model/Secret.js.map +1 -1
- package/lib/esm/secrets/onepassword/OnePasswordSecretService.js +2 -13
- package/lib/esm/secrets/onepassword/OnePasswordSecretService.js.map +1 -1
- package/lib/esm/secrets/vault/VaultSecretService.js +2 -13
- package/lib/esm/secrets/vault/VaultSecretService.js.map +1 -1
- package/lib/esm/shared/environmentValue.js +24 -0
- package/lib/esm/shared/environmentValue.js.map +1 -1
- package/lib/esm/shared/http/HttpApiService.js +181 -0
- package/lib/esm/shared/http/HttpApiService.js.map +1 -0
- package/lib/esm/shared/http/hermeticBoot.js +146 -0
- package/lib/esm/shared/http/hermeticBoot.js.map +1 -0
- package/lib/esm/shared/http/index.js +11 -0
- package/lib/esm/shared/http/index.js.map +1 -0
- package/lib/types/blob/azure/AzureBlobStoreService.d.cts +7 -7
- package/lib/types/blob/azure/AzureBlobStoreService.d.mts +7 -7
- package/lib/types/blob/core/BlobStoreService.d.cts +28 -27
- package/lib/types/blob/core/BlobStoreService.d.mts +28 -27
- package/lib/types/blob/gcp/GcsBlobStoreService.d.cts +7 -7
- package/lib/types/blob/gcp/GcsBlobStoreService.d.mts +7 -7
- package/lib/types/blob/s3/S3BlobStoreService.d.cts +9 -1
- package/lib/types/blob/s3/S3BlobStoreService.d.mts +9 -1
- package/lib/types/blob/s3/S3CompatibleBlobStoreService.d.cts +11 -15
- package/lib/types/blob/s3/S3CompatibleBlobStoreService.d.mts +11 -15
- package/lib/types/comms/email/EmailService.d.cts +184 -0
- package/lib/types/comms/email/EmailService.d.mts +184 -0
- package/lib/types/comms/email/index.d.cts +11 -0
- package/lib/types/comms/email/index.d.mts +11 -0
- package/lib/types/comms/email/mime.d.cts +84 -0
- package/lib/types/comms/email/mime.d.mts +84 -0
- package/lib/types/comms/email/smtp.d.cts +107 -0
- package/lib/types/comms/email/smtp.d.mts +107 -0
- package/lib/types/comms/environment.d.cts +84 -0
- package/lib/types/comms/environment.d.mts +84 -0
- package/lib/types/comms/gmail/GmailService.d.cts +190 -0
- package/lib/types/comms/gmail/GmailService.d.mts +190 -0
- package/lib/types/comms/gmail/index.d.cts +6 -0
- package/lib/types/comms/gmail/index.d.mts +6 -0
- package/lib/types/comms/index.d.cts +13 -0
- package/lib/types/comms/index.d.mts +13 -0
- package/lib/types/comms/slack/SlackService.d.cts +259 -0
- package/lib/types/comms/slack/SlackService.d.mts +259 -0
- package/lib/types/comms/slack/index.d.cts +6 -0
- package/lib/types/comms/slack/index.d.mts +6 -0
- package/lib/types/comms/teams/TeamsService.d.cts +172 -0
- package/lib/types/comms/teams/TeamsService.d.mts +172 -0
- package/lib/types/comms/teams/index.d.cts +6 -0
- package/lib/types/comms/teams/index.d.mts +6 -0
- package/lib/types/comms/telegram/TelegramService.d.cts +202 -0
- package/lib/types/comms/telegram/TelegramService.d.mts +202 -0
- package/lib/types/comms/telegram/index.d.cts +6 -0
- package/lib/types/comms/telegram/index.d.mts +6 -0
- package/lib/types/devops/environment.d.cts +62 -0
- package/lib/types/devops/environment.d.mts +62 -0
- package/lib/types/devops/github/GithubService.d.cts +287 -0
- package/lib/types/devops/github/GithubService.d.mts +287 -0
- package/lib/types/devops/github/index.d.cts +6 -0
- package/lib/types/devops/github/index.d.mts +6 -0
- package/lib/types/devops/gitlab/GitlabService.d.cts +277 -0
- package/lib/types/devops/gitlab/GitlabService.d.mts +277 -0
- package/lib/types/devops/gitlab/index.d.cts +6 -0
- package/lib/types/devops/gitlab/index.d.mts +6 -0
- package/lib/types/devops/index.d.cts +10 -0
- package/lib/types/devops/index.d.mts +10 -0
- package/lib/types/index.d.cts +2 -2
- package/lib/types/index.d.mts +2 -2
- package/lib/types/io/airtable/AirtableService.d.cts +268 -0
- package/lib/types/io/airtable/AirtableService.d.mts +268 -0
- package/lib/types/io/airtable/index.d.cts +6 -0
- package/lib/types/io/airtable/index.d.mts +6 -0
- package/lib/types/io/environment.d.cts +67 -0
- package/lib/types/io/environment.d.mts +67 -0
- package/lib/types/io/google-sheets/GoogleSheetsService.d.cts +204 -0
- package/lib/types/io/google-sheets/GoogleSheetsService.d.mts +204 -0
- package/lib/types/io/google-sheets/index.d.cts +6 -0
- package/lib/types/io/google-sheets/index.d.mts +6 -0
- package/lib/types/io/graphql/GraphqlService.d.cts +173 -0
- package/lib/types/io/graphql/GraphqlService.d.mts +173 -0
- package/lib/types/io/graphql/index.d.cts +6 -0
- package/lib/types/io/graphql/index.d.mts +6 -0
- package/lib/types/io/index.d.cts +12 -0
- package/lib/types/io/index.d.mts +12 -0
- package/lib/types/io/spreadsheet/SpreadsheetService.d.cts +144 -0
- package/lib/types/io/spreadsheet/SpreadsheetService.d.mts +144 -0
- package/lib/types/io/spreadsheet/index.d.cts +7 -0
- package/lib/types/io/spreadsheet/index.d.mts +7 -0
- package/lib/types/namespaces/index.d.cts +1 -0
- package/lib/types/namespaces/index.d.mts +1 -0
- package/lib/types/namespaces/models/credential.model.d.cts +23 -0
- package/lib/types/namespaces/models/credential.model.d.mts +23 -0
- package/lib/types/namespaces/models/index.d.cts +1 -0
- package/lib/types/namespaces/models/index.d.mts +1 -0
- package/lib/types/namespaces/rls/index.d.cts +10 -0
- package/lib/types/namespaces/rls/index.d.mts +10 -0
- package/lib/types/namespaces/rls/principal-resolver.d.cts +47 -0
- package/lib/types/namespaces/rls/principal-resolver.d.mts +47 -0
- package/lib/types/namespaces/rls/rls-bootstrap.service.d.cts +157 -0
- package/lib/types/namespaces/rls/rls-bootstrap.service.d.mts +157 -0
- package/lib/types/namespaces/rls/rls.constants.d.cts +52 -0
- package/lib/types/namespaces/rls/rls.constants.d.mts +52 -0
- package/lib/types/namespaces/rls/rls.template.d.cts +42 -0
- package/lib/types/namespaces/rls/rls.template.d.mts +42 -0
- package/lib/types/namespaces/rls/rls.types.d.cts +77 -0
- package/lib/types/namespaces/rls/rls.types.d.mts +77 -0
- package/lib/types/namespaces/rls/session-binding.d.cts +87 -0
- package/lib/types/namespaces/rls/session-binding.d.mts +87 -0
- package/lib/types/namespaces/services/credential.service.d.cts +175 -0
- package/lib/types/namespaces/services/credential.service.d.mts +175 -0
- package/lib/types/namespaces/services/index.d.cts +1 -0
- package/lib/types/namespaces/services/index.d.mts +1 -0
- package/lib/types/namespaces/types.d.cts +37 -0
- package/lib/types/namespaces/types.d.mts +37 -0
- package/lib/types/redis/adapter.d.cts +2 -0
- package/lib/types/redis/adapter.d.mts +2 -0
- package/lib/types/redis/types.d.cts +27 -2
- package/lib/types/redis/types.d.mts +27 -2
- package/lib/types/secrets/InfraCredentialBootstrap.d.cts +100 -0
- package/lib/types/secrets/InfraCredentialBootstrap.d.mts +100 -0
- package/lib/types/secrets/core/SecretTypes.d.cts +15 -1
- package/lib/types/secrets/core/SecretTypes.d.mts +15 -1
- package/lib/types/secrets/fs/FsSecretEnvironment.d.cts +42 -0
- package/lib/types/secrets/fs/FsSecretEnvironment.d.mts +42 -0
- package/lib/types/secrets/fs/FsSecretService.d.cts +207 -0
- package/lib/types/secrets/fs/FsSecretService.d.mts +207 -0
- package/lib/types/secrets/fs/FsSecretServiceConfig.d.cts +37 -0
- package/lib/types/secrets/fs/FsSecretServiceConfig.d.mts +37 -0
- package/lib/types/secrets/fs/index.d.cts +9 -0
- package/lib/types/secrets/fs/index.d.mts +9 -0
- package/lib/types/secrets/index.d.cts +2 -0
- package/lib/types/secrets/index.d.mts +2 -0
- package/lib/types/secrets/model/ModelSecretService.d.cts +190 -1
- package/lib/types/secrets/model/ModelSecretService.d.mts +190 -1
- package/lib/types/secrets/model/Secret.d.cts +44 -3
- package/lib/types/secrets/model/Secret.d.mts +44 -3
- package/lib/types/shared/environmentValue.d.cts +24 -0
- package/lib/types/shared/environmentValue.d.mts +24 -0
- package/lib/types/shared/http/HttpApiService.d.cts +193 -0
- package/lib/types/shared/http/HttpApiService.d.mts +193 -0
- package/lib/types/shared/http/hermeticBoot.d.cts +84 -0
- package/lib/types/shared/http/hermeticBoot.d.mts +84 -0
- package/lib/types/shared/http/index.d.cts +10 -0
- package/lib/types/shared/http/index.d.mts +10 -0
- package/package.json +180 -3
- package/sql/002_rls.sql +660 -15
- package/sql/004_credentials.sql +46 -0
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module integrations/namespaces/rls/bootstrap
|
|
3
|
+
* @summary Bootstrap service that applies the namespace row-level-security template.
|
|
4
|
+
* @description Wires the SQL template into a query executor (for example a
|
|
5
|
+
* `pg.Client`) so deployments apply the policies through application bootstrap
|
|
6
|
+
* or a migration runner instead of hand-running SQL. Also exposes helpers
|
|
7
|
+
* that bind `app.principal_id` transaction-locally for request-scoped access.
|
|
8
|
+
*/
|
|
9
|
+
import { ClientBasedService } from "@decaf-ts/core";
|
|
10
|
+
import { InternalError, ValidationError } from "@decaf-ts/db-decorators";
|
|
11
|
+
import { RLS_FUNCTION_STATEMENTS, rlsBootstrapStatements, rlsPolicyStatements, } from "./rls.template.js";
|
|
12
|
+
import { RLS_FUNCTION_OWNER_QUERY, RLS_SETTINGS } from "./rls.constants.js";
|
|
13
|
+
const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
14
|
+
/**
|
|
15
|
+
* @description Thrown when the executor role cannot safely own the RLS helper functions.
|
|
16
|
+
* @summary Raised by
|
|
17
|
+
* `RlsBootstrapService.assertFunctionOwnerPrivileges()` when the current
|
|
18
|
+
* database role is neither `SUPERUSER` nor `BYPASSRLS` (or when its
|
|
19
|
+
* privileges cannot be determined). Extends
|
|
20
|
+
* `{@link InternalError}` so callers can catch it generically, while
|
|
21
|
+
* carrying the distinctive `RlsFunctionOwnerError` name for
|
|
22
|
+
* fail-closed matching.
|
|
23
|
+
* @class RlsFunctionOwnerError
|
|
24
|
+
* @category Namespaces
|
|
25
|
+
*/
|
|
26
|
+
export class RlsFunctionOwnerError extends InternalError {
|
|
27
|
+
constructor(message) {
|
|
28
|
+
super(message);
|
|
29
|
+
this.name = "RlsFunctionOwnerError";
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function assertTransactionLocalBinding(method, options) {
|
|
33
|
+
if (options && options.local !== undefined && options.local !== true) {
|
|
34
|
+
throw new ValidationError(`${method} only supports transaction-local binding: session-wide binding is not allowed`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* @description Validates a principal identifier before binding it to the
|
|
39
|
+
* `app.principal_id` RLS setting.
|
|
40
|
+
* @summary Fail-closed shape guard shared by the binding helpers: the value
|
|
41
|
+
* must be a non-empty UUID string. On failure it throws a `ValidationError`
|
|
42
|
+
* with a fixed message that never echoes the rejected value, so invalid input
|
|
43
|
+
* cannot leak into error surfaces or logs.
|
|
44
|
+
* @function assertPrincipalId
|
|
45
|
+
* @param {string} principalId - Candidate principal (or tenant) UUID to validate.
|
|
46
|
+
* @returns {void}
|
|
47
|
+
* @throws {ValidationError} When the value is empty or not UUID-shaped; the message does not include the rejected value.
|
|
48
|
+
*/
|
|
49
|
+
export function assertPrincipalId(principalId) {
|
|
50
|
+
if (!principalId || !UUID_PATTERN.test(principalId)) {
|
|
51
|
+
throw new ValidationError("Invalid RLS principal id");
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* @description Applies the namespace RLS template through a SQL executor.
|
|
56
|
+
* @summary The service boots with a SQL executor (`pg.Client`, `pg.Pool`, or a
|
|
57
|
+
* compatible wrapper) and applies the namespace row-level-security template:
|
|
58
|
+
* function plus policy DDL executed sequentially. It is the deployment-side
|
|
59
|
+
* entry point for the RLS template, meant to run during application bootstrap
|
|
60
|
+
* or a migration runner instead of hand-running SQL. The template is
|
|
61
|
+
* idempotent and may run on every deployment.
|
|
62
|
+
* @class RlsBootstrapService
|
|
63
|
+
* @category Namespaces
|
|
64
|
+
*/
|
|
65
|
+
export class RlsBootstrapService extends ClientBasedService {
|
|
66
|
+
constructor() {
|
|
67
|
+
super();
|
|
68
|
+
}
|
|
69
|
+
async initialize(...args) {
|
|
70
|
+
const client = args[0];
|
|
71
|
+
if (!client || typeof client.query !== "function") {
|
|
72
|
+
throw new ValidationError("RlsBootstrapService requires a query executor as its first argument");
|
|
73
|
+
}
|
|
74
|
+
const config = args[1] ?? {};
|
|
75
|
+
return { config, client };
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* @description Applies the configured (or bundled) RLS statement list.
|
|
79
|
+
* @summary The service is booted with an executor (`pg.Client`, `pg.Pool`, or a
|
|
80
|
+
* compatible wrapper) and applies function plus policy DDL sequentially. The
|
|
81
|
+
* template is idempotent and may run on every deployment. Before any DDL is
|
|
82
|
+
* sent, `assertFunctionOwnerPrivileges()` verifies that the current
|
|
83
|
+
* executor role is `SUPERUSER` or `BYPASSRLS` and fails closed otherwise,
|
|
84
|
+
* so `SECURITY DEFINER` helper functions are never created with an owner
|
|
85
|
+
* that would recurse under `FORCE ROW LEVEL SECURITY`.
|
|
86
|
+
* @return {Promise<{applied: number}>} The number of statements executed.
|
|
87
|
+
* @throws {RlsFunctionOwnerError} When the executor role is neither `SUPERUSER` nor `BYPASSRLS`, or its privileges cannot be determined.
|
|
88
|
+
* @throws {InternalError} When the resolved statement list is empty.
|
|
89
|
+
*/
|
|
90
|
+
async apply(...args) {
|
|
91
|
+
const { log } = (await this.logCtx(args, "apply", true)).for(this.apply);
|
|
92
|
+
const statements = this.statements();
|
|
93
|
+
if (!statements.length) {
|
|
94
|
+
throw new InternalError("No RLS statements to apply");
|
|
95
|
+
}
|
|
96
|
+
await this.assertFunctionOwnerPrivileges(...args);
|
|
97
|
+
log.verbose(`Applying ${statements.length} RLS statements`);
|
|
98
|
+
for (const statement of statements) {
|
|
99
|
+
await this.client.query(statement);
|
|
100
|
+
}
|
|
101
|
+
log.info(`Applied namespace RLS template (${statements.length} statements)`);
|
|
102
|
+
return { applied: statements.length };
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* @description Verifies that the current executor role can own the RLS helper functions.
|
|
106
|
+
* @summary Runs `RLS_FUNCTION_OWNER_QUERY` through the configured executor
|
|
107
|
+
* and reads the current role's `rolsuper`/`rolbypassrls` flags from
|
|
108
|
+
* `pg_roles`. Fails closed: when the row is missing or the flags are not
|
|
109
|
+
* booleans, it throws `RlsFunctionOwnerError` with the same
|
|
110
|
+
* fail-closed semantics as an explicit privilege failure. Called
|
|
111
|
+
* automatically by `apply()` before any DDL is executed.
|
|
112
|
+
* @param args - Optional trailing decaf `Context` arguments forwarded to the log context.
|
|
113
|
+
* @return Resolves when the current role is `SUPERUSER` or `BYPASSRLS`.
|
|
114
|
+
* @throws {RlsFunctionOwnerError} When the executor role is neither `SUPERUSER` nor `BYPASSRLS`, or when its privileges cannot be determined from `pg_roles`.
|
|
115
|
+
*/
|
|
116
|
+
async assertFunctionOwnerPrivileges(...args) {
|
|
117
|
+
const { log } = (await this.logCtx(args, "assertFunctionOwnerPrivileges", true)).for(this.assertFunctionOwnerPrivileges);
|
|
118
|
+
const result = await this.client.query(RLS_FUNCTION_OWNER_QUERY);
|
|
119
|
+
const row = (result.rows?.[0] ?? undefined);
|
|
120
|
+
const roleName = row?.rolname
|
|
121
|
+
? JSON.stringify(row.rolname)
|
|
122
|
+
: "current_user";
|
|
123
|
+
if (typeof row?.rolsuper !== "boolean" ||
|
|
124
|
+
typeof row?.rolbypassrls !== "boolean") {
|
|
125
|
+
throw new RlsFunctionOwnerError(`Cannot apply the namespace RLS template: could not determine the privileges of ${roleName}. ` +
|
|
126
|
+
"The SECURITY DEFINER helper functions require a SUPERUSER or BYPASSRLS owner; refusing to " +
|
|
127
|
+
"apply policies that would recurse under FORCE ROW LEVEL SECURITY.");
|
|
128
|
+
}
|
|
129
|
+
if (!row.rolsuper && !row.rolbypassrls) {
|
|
130
|
+
throw new RlsFunctionOwnerError(`Cannot apply the namespace RLS template as ${roleName}: the executor role is neither SUPERUSER ` +
|
|
131
|
+
"nor BYPASSRLS. The SECURITY DEFINER helper functions must be owned by a role that bypasses RLS, " +
|
|
132
|
+
"otherwise every policy evaluation recurses under FORCE ROW LEVEL SECURITY and fails. Connect as " +
|
|
133
|
+
"the database owner/BYPASSRLS migration role, or create the helper functions with a dedicated " +
|
|
134
|
+
"BYPASSRLS owner.");
|
|
135
|
+
}
|
|
136
|
+
log.verbose(`Verified RLS function owner privileges for ${roleName}`);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* @description Resolves the statement list for the active configuration.
|
|
140
|
+
*/
|
|
141
|
+
statements() {
|
|
142
|
+
const config = this._config ?? {};
|
|
143
|
+
if (config.statements)
|
|
144
|
+
return [...config.statements];
|
|
145
|
+
if (config.policies) {
|
|
146
|
+
return [
|
|
147
|
+
...RLS_FUNCTION_STATEMENTS,
|
|
148
|
+
...rlsPolicyStatements(config.policies),
|
|
149
|
+
];
|
|
150
|
+
}
|
|
151
|
+
return rlsBootstrapStatements();
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* @description Binds the acting principal for the current transaction.
|
|
155
|
+
* @summary Issues parameterized `SELECT set_config($1, $2, true)` after
|
|
156
|
+
* validation, so the binding lives only for the current transaction and is
|
|
157
|
+
* discarded on commit/rollback — safe on pooled connections. A session-wide
|
|
158
|
+
* binding request fails with `ValidationError` before any SQL is sent, and
|
|
159
|
+
* the verbose log records only that a binding happened, never the principal
|
|
160
|
+
* id.
|
|
161
|
+
* @param principalId Principal UUID stored in `app.principal_id`.
|
|
162
|
+
* @param options Only `local: true` (the default) is accepted; the binding is
|
|
163
|
+
* always transaction-local and is discarded on commit/rollback.
|
|
164
|
+
* @returns {Promise<void>} Resolves once the setting is bound transaction-locally.
|
|
165
|
+
* @throws {ValidationError} When the principal id is invalid or a session-wide binding is requested.
|
|
166
|
+
*/
|
|
167
|
+
async setPrincipal(principalId, options = {}, ...args) {
|
|
168
|
+
const { log } = (await this.logCtx(args, "setPrincipal", true)).for(this.setPrincipal);
|
|
169
|
+
assertPrincipalId(principalId);
|
|
170
|
+
assertTransactionLocalBinding("setPrincipal", options);
|
|
171
|
+
await this.client.query("SELECT set_config($1, $2, true)", [
|
|
172
|
+
RLS_SETTINGS.Principal,
|
|
173
|
+
principalId,
|
|
174
|
+
]);
|
|
175
|
+
log.verbose("Bound RLS principal (transaction-local)");
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* @description Binds the acting tenant for the current transaction.
|
|
179
|
+
* @summary Issues parameterized `SELECT set_config($1, $2, true)` after
|
|
180
|
+
* validation, so the binding lives only for the current transaction and is
|
|
181
|
+
* discarded on commit/rollback — safe on pooled connections. A session-wide
|
|
182
|
+
* binding request fails with `ValidationError` before any SQL is sent, and
|
|
183
|
+
* the verbose log records only that a binding happened, never the tenant
|
|
184
|
+
* id.
|
|
185
|
+
* @param tenantId Tenant UUID stored in `app.tenant_id`.
|
|
186
|
+
* @param options Only `local: true` (the default) is accepted; the binding is
|
|
187
|
+
* always transaction-local and is discarded on commit/rollback.
|
|
188
|
+
* @returns {Promise<void>} Resolves once the setting is bound transaction-locally.
|
|
189
|
+
* @throws {ValidationError} When the tenant id is invalid or a session-wide binding is requested.
|
|
190
|
+
*/
|
|
191
|
+
async setTenant(tenantId, options = {}, ...args) {
|
|
192
|
+
const { log } = (await this.logCtx(args, "setTenant", true)).for(this.setTenant);
|
|
193
|
+
assertPrincipalId(tenantId);
|
|
194
|
+
assertTransactionLocalBinding("setTenant", options);
|
|
195
|
+
await this.client.query("SELECT set_config($1, $2, true)", [
|
|
196
|
+
RLS_SETTINGS.Tenant,
|
|
197
|
+
tenantId,
|
|
198
|
+
]);
|
|
199
|
+
log.verbose("Bound RLS tenant (transaction-local)");
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* @description Clears the acting principal for the current transaction.
|
|
203
|
+
* @summary Resets `app.principal_id` to the empty string with
|
|
204
|
+
* `SELECT set_config($1, $2, true)`, so the clear is also transaction-local
|
|
205
|
+
* and never reaches the pooled session. A session-wide clear request fails
|
|
206
|
+
* with `ValidationError` before any SQL is sent.
|
|
207
|
+
* @param options Only `local: true` (the default) is accepted; the clear is
|
|
208
|
+
* always transaction-local and does not reach the pooled session.
|
|
209
|
+
* @returns {Promise<void>} Resolves once the setting is cleared transaction-locally.
|
|
210
|
+
* @throws {ValidationError} When a session-wide clear is requested.
|
|
211
|
+
*/
|
|
212
|
+
async clearPrincipal(options = {}, ...args) {
|
|
213
|
+
const { log } = (await this.logCtx(args, "clearPrincipal", true)).for(this.clearPrincipal);
|
|
214
|
+
assertTransactionLocalBinding("clearPrincipal", options);
|
|
215
|
+
await this.client.query("SELECT set_config($1, $2, true)", [
|
|
216
|
+
RLS_SETTINGS.Principal,
|
|
217
|
+
"",
|
|
218
|
+
]);
|
|
219
|
+
log.verbose("Cleared RLS principal (transaction-local)");
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* @description Returns the principal currently bound to the connection.
|
|
223
|
+
*/
|
|
224
|
+
async currentPrincipal(...args) {
|
|
225
|
+
const { log } = (await this.logCtx(args, "currentPrincipal", true)).for(this.currentPrincipal);
|
|
226
|
+
log.verbose("Reading current RLS principal");
|
|
227
|
+
const result = await this.client.query("SELECT app_rls_principal_id() AS principal_id");
|
|
228
|
+
const row = (result.rows?.[0] ?? {});
|
|
229
|
+
return row.principal_id ?? null;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* @description Runs a callback inside a transaction with the RLS principal bound.
|
|
234
|
+
* @summary The executor must be a single connection (`pg.Client`), not a pool,
|
|
235
|
+
* because the transaction and the `app.principal_id` setting are
|
|
236
|
+
* connection-scoped. By default the transaction is rolled back, keeping
|
|
237
|
+
* integration-test mutations isolated; pass `{ commit: true }` for real writes.
|
|
238
|
+
*/
|
|
239
|
+
export async function runAsPrincipal(executor, principalId, run, options = {}) {
|
|
240
|
+
assertPrincipalId(principalId);
|
|
241
|
+
await executor.query("BEGIN");
|
|
242
|
+
try {
|
|
243
|
+
await executor.query("SELECT set_config($1, $2, true)", [
|
|
244
|
+
RLS_SETTINGS.Principal,
|
|
245
|
+
principalId,
|
|
246
|
+
]);
|
|
247
|
+
const result = await run(executor);
|
|
248
|
+
await executor.query(options.commit ? "COMMIT" : "ROLLBACK");
|
|
249
|
+
return result;
|
|
250
|
+
}
|
|
251
|
+
catch (error) {
|
|
252
|
+
try {
|
|
253
|
+
await executor.query("ROLLBACK");
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
// preserve the original failure
|
|
257
|
+
}
|
|
258
|
+
throw error;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=rls-bootstrap.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rls-bootstrap.service.js","sourceRoot":"","sources":["../../../../src/namespaces/rls/rls-bootstrap.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,mBAAmB,GACpB,0BAAuB;AAMxB,OAAO,EAAE,wBAAwB,EAAE,YAAY,EAAE,2BAAwB;AAEzE,MAAM,YAAY,GAChB,iEAAiE,CAAC;AAEpE;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,qBAAsB,SAAQ,aAAa;IACtD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAgBD,SAAS,6BAA6B,CACpC,MAAc,EACd,OAAsC;IAEtC,IAAI,OAAO,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QACrE,MAAM,IAAI,eAAe,CACvB,GAAG,MAAM,+EAA+E,CACzF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,iBAAiB,CAAC,WAAmB;IACnD,IAAI,CAAC,WAAW,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,eAAe,CAAC,0BAA0B,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,OAAO,mBAAoB,SAAQ,kBAGxC;IACC;QACE,KAAK,EAAE,CAAC;IACV,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAG,IAAW;QAI7B,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAiC,CAAC;QACvD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YAClD,MAAM,IAAI,eAAe,CACvB,qEAAqE,CACtE,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAI,IAAI,CAAC,CAAC,CAAoC,IAAI,EAAE,CAAC;QACjE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,KAAK,CAAC,GAAG,IAAW;QACxB,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzE,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACrC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YACvB,MAAM,IAAI,aAAa,CAAC,4BAA4B,CAAC,CAAC;QACxD,CAAC;QACD,MAAM,IAAI,CAAC,6BAA6B,CAAC,GAAG,IAAI,CAAC,CAAC;QAClD,GAAG,CAAC,OAAO,CAAC,YAAY,UAAU,CAAC,MAAM,iBAAiB,CAAC,CAAC;QAC5D,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACrC,CAAC;QACD,GAAG,CAAC,IAAI,CACN,mCAAmC,UAAU,CAAC,MAAM,cAAc,CACnE,CAAC;QACF,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC;IACxC,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,6BAA6B,CAAC,GAAG,IAAW;QAChD,MAAM,EAAE,GAAG,EAAE,GAAG,CACd,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,+BAA+B,EAAE,IAAI,CAAC,CAC/D,CAAC,GAAG,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACjE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS,CAE7B,CAAC;QACd,MAAM,QAAQ,GAAG,GAAG,EAAE,OAAO;YAC3B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC;YAC7B,CAAC,CAAC,cAAc,CAAC;QACnB,IACE,OAAO,GAAG,EAAE,QAAQ,KAAK,SAAS;YAClC,OAAO,GAAG,EAAE,YAAY,KAAK,SAAS,EACtC,CAAC;YACD,MAAM,IAAI,qBAAqB,CAC7B,kFAAkF,QAAQ,IAAI;gBAC5F,4FAA4F;gBAC5F,mEAAmE,CACtE,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YACvC,MAAM,IAAI,qBAAqB,CAC7B,8CAA8C,QAAQ,2CAA2C;gBAC/F,kGAAkG;gBAClG,kGAAkG;gBAClG,+FAA+F;gBAC/F,kBAAkB,CACrB,CAAC;QACJ,CAAC;QACD,GAAG,CAAC,OAAO,CAAC,8CAA8C,QAAQ,EAAE,CAAC,CAAC;IACxE,CAAC;IAED;;OAEG;IACH,UAAU;QACR,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;QAClC,IAAI,MAAM,CAAC,UAAU;YAAE,OAAO,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QACrD,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,OAAO;gBACL,GAAG,uBAAuB;gBAC1B,GAAG,mBAAmB,CAAC,MAAM,CAAC,QAAQ,CAAC;aACxC,CAAC;QACJ,CAAC;QACD,OAAO,sBAAsB,EAAE,CAAC;IAClC,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,YAAY,CAChB,WAAmB,EACnB,UAA6B,EAAE,EAC/B,GAAG,IAAW;QAEd,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CACjE,IAAI,CAAC,YAAY,CAClB,CAAC;QACF,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAC/B,6BAA6B,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE;YACzD,YAAY,CAAC,SAAS;YACtB,WAAW;SACZ,CAAC,CAAC;QACH,GAAG,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC;IACzD,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,SAAS,CACb,QAAgB,EAChB,UAA6B,EAAE,EAC/B,GAAG,IAAW;QAEd,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAC9D,IAAI,CAAC,SAAS,CACf,CAAC;QACF,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC5B,6BAA6B,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE;YACzD,YAAY,CAAC,MAAM;YACnB,QAAQ;SACT,CAAC,CAAC;QACH,GAAG,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC;IACtD,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,cAAc,CAClB,UAA6B,EAAE,EAC/B,GAAG,IAAW;QAEd,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CACnE,IAAI,CAAC,cAAc,CACpB,CAAC;QACF,6BAA6B,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QACzD,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE;YACzD,YAAY,CAAC,SAAS;YACtB,EAAE;SACH,CAAC,CAAC;QACH,GAAG,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,GAAG,IAAW;QACnC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CACrE,IAAI,CAAC,gBAAgB,CACtB,CAAC;QACF,GAAG,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CACpC,+CAA+C,CAChD,CAAC;QACF,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAqC,CAAC;QACzE,OAAO,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC;IAClC,CAAC;CACF;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAA0B,EAC1B,WAAmB,EACnB,GAA+C,EAC/C,UAAiC,EAAE;IAEnC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC/B,MAAM,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9B,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,KAAK,CAAC,iCAAiC,EAAE;YACtD,YAAY,CAAC,SAAS;YACtB,WAAW;SACZ,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAC7D,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,gCAAgC;QAClC,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module integrations/namespaces/rls/constants
|
|
3
|
+
* @summary Row-level-security constants for the namespace authorization schema.
|
|
4
|
+
* @description Canonical permission keys, session settings, default role keys, and
|
|
5
|
+
* the tables covered by the namespace RLS template.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* @description Permission keys consumed by the SQL RLS policies.
|
|
9
|
+
* @summary A namespace reader can only read, a writer can also create/update/delete
|
|
10
|
+
* non-administrative rows, and an admin can do everything in the namespace.
|
|
11
|
+
*/
|
|
12
|
+
export const RLS_PERMISSION_KEYS = {
|
|
13
|
+
Read: "namespace.read",
|
|
14
|
+
Write: "namespace.write",
|
|
15
|
+
Admin: "namespace.admin",
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* @description Session settings read by the RLS policies.
|
|
19
|
+
* @summary The application must set `app.principal_id` for every request-scoped
|
|
20
|
+
* database session or transaction before querying namespace tables.
|
|
21
|
+
*/
|
|
22
|
+
export const RLS_SETTINGS = {
|
|
23
|
+
Principal: "app.principal_id",
|
|
24
|
+
Tenant: "app.tenant_id",
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* @description Default role keys for the reader/writer/admin matrix.
|
|
28
|
+
* @summary Bootstrapping a tenant with these keys gives consumers a stable
|
|
29
|
+
* three-tier namespace role model without coupling them to custom role names.
|
|
30
|
+
*/
|
|
31
|
+
export const RLS_ROLE_KEYS = {
|
|
32
|
+
Reader: "namespace-reader",
|
|
33
|
+
Writer: "namespace-writer",
|
|
34
|
+
Admin: "namespace-admin",
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* @description Boot-time privilege probe for the RLS `SECURITY DEFINER` helper functions.
|
|
38
|
+
* @summary Reads the current role's `rolsuper` and `rolbypassrls` flags from
|
|
39
|
+
* `pg_roles`. `RlsBootstrapService.assertFunctionOwnerPrivileges()` executes
|
|
40
|
+
* this query before applying any RLS DDL and refuses to proceed unless the
|
|
41
|
+
* executor role is `SUPERUSER` or `BYPASSRLS`, because a `SECURITY DEFINER`
|
|
42
|
+
* owner that does not bypass RLS makes every policy evaluation recurse under
|
|
43
|
+
* `FORCE ROW LEVEL SECURITY`.
|
|
44
|
+
*/
|
|
45
|
+
export const RLS_FUNCTION_OWNER_QUERY = "SELECT current_user AS rolname, rolsuper, rolbypassrls FROM pg_roles WHERE rolname = current_user";
|
|
46
|
+
/**
|
|
47
|
+
* @description Tables protected by the namespace RLS template.
|
|
48
|
+
* @summary Includes the authorization machinery, org profiles, protected
|
|
49
|
+
* resources, and the slice-1 credential/secret records.
|
|
50
|
+
*/
|
|
51
|
+
export const RLS_PROTECTED_TABLES = [
|
|
52
|
+
"tenants",
|
|
53
|
+
"org_units",
|
|
54
|
+
"org_unit_closure",
|
|
55
|
+
"users",
|
|
56
|
+
"groups",
|
|
57
|
+
"principals",
|
|
58
|
+
"tenant_memberships",
|
|
59
|
+
"org_unit_memberships",
|
|
60
|
+
"group_memberships",
|
|
61
|
+
"permissions",
|
|
62
|
+
"roles",
|
|
63
|
+
"role_permissions",
|
|
64
|
+
"role_assignments",
|
|
65
|
+
"inheritance_blocks",
|
|
66
|
+
"protected_resources",
|
|
67
|
+
"resource_grants",
|
|
68
|
+
"effective_permissions",
|
|
69
|
+
"storage_bindings",
|
|
70
|
+
"tenant_profiles",
|
|
71
|
+
"org_unit_profiles",
|
|
72
|
+
"credentials",
|
|
73
|
+
"secrets",
|
|
74
|
+
];
|
|
75
|
+
//# sourceMappingURL=rls.constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rls.constants.js","sourceRoot":"","sources":["../../../../src/namespaces/rls/rls.constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,IAAI,EAAE,gBAAgB;IACtB,KAAK,EAAE,iBAAiB;IACxB,KAAK,EAAE,iBAAiB;CAChB,CAAC;AAEX;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,SAAS,EAAE,kBAAkB;IAC7B,MAAM,EAAE,eAAe;CACf,CAAC;AAEX;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,MAAM,EAAE,kBAAkB;IAC1B,MAAM,EAAE,kBAAkB;IAC1B,KAAK,EAAE,iBAAiB;CAChB,CAAC;AAEX;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,wBAAwB,GACnC,mGAAmG,CAAC;AAEtG;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,SAAS;IACT,WAAW;IACX,kBAAkB;IAClB,OAAO;IACP,QAAQ;IACR,YAAY;IACZ,oBAAoB;IACpB,sBAAsB;IACtB,mBAAmB;IACnB,aAAa;IACb,OAAO;IACP,kBAAkB;IAClB,kBAAkB;IAClB,oBAAoB;IACpB,qBAAqB;IACrB,iBAAiB;IACjB,uBAAuB;IACvB,kBAAkB;IAClB,iBAAiB;IACjB,mBAAmB;IACnB,aAAa;IACb,SAAS;CACD,CAAC"}
|