@aglyn/tenant-data-admin 1.0.0-beta.143
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/LICENSE +201 -0
- package/README.md +7 -0
- package/jest.integration.config.d.ts +39 -0
- package/jest.integration.setup.d.ts +17 -0
- package/package.json +51 -0
- package/src/index.d.ts +17 -0
- package/src/index.js +18 -0
- package/src/index.js.map +1 -0
- package/src/lib/render-cache.d.ts +184 -0
- package/src/lib/render-cache.js +198 -0
- package/src/lib/render-cache.js.map +1 -0
- package/src/lib/server/account-addresses.d.ts +160 -0
- package/src/lib/server/account-addresses.js +311 -0
- package/src/lib/server/account-addresses.js.map +1 -0
- package/src/lib/server/account-emails.d.ts +219 -0
- package/src/lib/server/account-emails.js +640 -0
- package/src/lib/server/account-emails.js.map +1 -0
- package/src/lib/server/admin-audit.d.ts +180 -0
- package/src/lib/server/admin-audit.js +233 -0
- package/src/lib/server/admin-audit.js.map +1 -0
- package/src/lib/server/analytics-retention.d.ts +63 -0
- package/src/lib/server/analytics-retention.js +66 -0
- package/src/lib/server/analytics-retention.js.map +1 -0
- package/src/lib/server/api-http.d.ts +159 -0
- package/src/lib/server/api-http.js +230 -0
- package/src/lib/server/api-http.js.map +1 -0
- package/src/lib/server/api-keys.d.ts +117 -0
- package/src/lib/server/api-keys.js +298 -0
- package/src/lib/server/api-keys.js.map +1 -0
- package/src/lib/server/auth-handoff.d.ts +165 -0
- package/src/lib/server/auth-handoff.js +482 -0
- package/src/lib/server/auth-handoff.js.map +1 -0
- package/src/lib/server/auth-pools.d.ts +246 -0
- package/src/lib/server/auth-pools.js +551 -0
- package/src/lib/server/auth-pools.js.map +1 -0
- package/src/lib/server/billing-addons.d.ts +171 -0
- package/src/lib/server/billing-addons.js +277 -0
- package/src/lib/server/billing-addons.js.map +1 -0
- package/src/lib/server/campaign-attribution-store.d.ts +55 -0
- package/src/lib/server/campaign-attribution-store.js +95 -0
- package/src/lib/server/campaign-attribution-store.js.map +1 -0
- package/src/lib/server/campaign-conversion-attribution.d.ts +205 -0
- package/src/lib/server/campaign-conversion-attribution.js +279 -0
- package/src/lib/server/campaign-conversion-attribution.js.map +1 -0
- package/src/lib/server/client-error-report.d.ts +301 -0
- package/src/lib/server/client-error-report.js +755 -0
- package/src/lib/server/client-error-report.js.map +1 -0
- package/src/lib/server/connect-account-status.d.ts +74 -0
- package/src/lib/server/connect-account-status.js +94 -0
- package/src/lib/server/connect-account-status.js.map +1 -0
- package/src/lib/server/connect-payout-failure.d.ts +103 -0
- package/src/lib/server/connect-payout-failure.js +127 -0
- package/src/lib/server/connect-payout-failure.js.map +1 -0
- package/src/lib/server/console-api-rate-limit.d.ts +81 -0
- package/src/lib/server/console-api-rate-limit.js +111 -0
- package/src/lib/server/console-api-rate-limit.js.map +1 -0
- package/src/lib/server/console-domains.d.ts +326 -0
- package/src/lib/server/console-domains.js +779 -0
- package/src/lib/server/console-domains.js.map +1 -0
- package/src/lib/server/consume-once.d.ts +91 -0
- package/src/lib/server/consume-once.js +96 -0
- package/src/lib/server/consume-once.js.map +1 -0
- package/src/lib/server/contact-company-link.d.ts +85 -0
- package/src/lib/server/contact-company-link.js +105 -0
- package/src/lib/server/contact-company-link.js.map +1 -0
- package/src/lib/server/contact-email-engagement.d.ts +32 -0
- package/src/lib/server/contact-email-engagement.js +145 -0
- package/src/lib/server/contact-email-engagement.js.map +1 -0
- package/src/lib/server/contact-email-index.d.ts +56 -0
- package/src/lib/server/contact-email-index.js +158 -0
- package/src/lib/server/contact-email-index.js.map +1 -0
- package/src/lib/server/contact-lifecycle-floor.d.ts +89 -0
- package/src/lib/server/contact-lifecycle-floor.js +88 -0
- package/src/lib/server/contact-lifecycle-floor.js.map +1 -0
- package/src/lib/server/contact-merge.d.ts +55 -0
- package/src/lib/server/contact-merge.js +279 -0
- package/src/lib/server/contact-merge.js.map +1 -0
- package/src/lib/server/contact-suppression.d.ts +153 -0
- package/src/lib/server/contact-suppression.js +259 -0
- package/src/lib/server/contact-suppression.js.map +1 -0
- package/src/lib/server/crm-booking-activity.d.ts +86 -0
- package/src/lib/server/crm-booking-activity.js +251 -0
- package/src/lib/server/crm-booking-activity.js.map +1 -0
- package/src/lib/server/crm-email-activity.d.ts +112 -0
- package/src/lib/server/crm-email-activity.js +143 -0
- package/src/lib/server/crm-email-activity.js.map +1 -0
- package/src/lib/server/crm-inbound-email.d.ts +145 -0
- package/src/lib/server/crm-inbound-email.js +287 -0
- package/src/lib/server/crm-inbound-email.js.map +1 -0
- package/src/lib/server/crm-next-activity.d.ts +74 -0
- package/src/lib/server/crm-next-activity.js +194 -0
- package/src/lib/server/crm-next-activity.js.map +1 -0
- package/src/lib/server/crm-records.d.ts +144 -0
- package/src/lib/server/crm-records.js +218 -0
- package/src/lib/server/crm-records.js.map +1 -0
- package/src/lib/server/csp-aggregate.d.ts +62 -0
- package/src/lib/server/csp-aggregate.js +276 -0
- package/src/lib/server/csp-aggregate.js.map +1 -0
- package/src/lib/server/data-storage-gate.d.ts +66 -0
- package/src/lib/server/data-storage-gate.js +48 -0
- package/src/lib/server/data-storage-gate.js.map +1 -0
- package/src/lib/server/dataset-live-pages.d.ts +179 -0
- package/src/lib/server/dataset-live-pages.js +421 -0
- package/src/lib/server/dataset-live-pages.js.map +1 -0
- package/src/lib/server/dns-probe.d.ts +53 -0
- package/src/lib/server/dns-probe.js +184 -0
- package/src/lib/server/dns-probe.js.map +1 -0
- package/src/lib/server/document-id.d.ts +29 -0
- package/src/lib/server/document-id.js +100 -0
- package/src/lib/server/document-id.js.map +1 -0
- package/src/lib/server/domain-provider-vercel.d.ts +33 -0
- package/src/lib/server/domain-provider-vercel.js +298 -0
- package/src/lib/server/domain-provider-vercel.js.map +1 -0
- package/src/lib/server/domain-provider-webhook.d.ts +73 -0
- package/src/lib/server/domain-provider-webhook.js +223 -0
- package/src/lib/server/domain-provider-webhook.js.map +1 -0
- package/src/lib/server/domain-provider-wildcard.d.ts +54 -0
- package/src/lib/server/domain-provider-wildcard.js +163 -0
- package/src/lib/server/domain-provider-wildcard.js.map +1 -0
- package/src/lib/server/domain-provider.d.ts +197 -0
- package/src/lib/server/domain-provider.js +221 -0
- package/src/lib/server/domain-provider.js.map +1 -0
- package/src/lib/server/duplicate-activity.d.ts +54 -0
- package/src/lib/server/duplicate-activity.js +67 -0
- package/src/lib/server/duplicate-activity.js.map +1 -0
- package/src/lib/server/duplicate-resource.d.ts +55 -0
- package/src/lib/server/duplicate-resource.js +474 -0
- package/src/lib/server/duplicate-resource.js.map +1 -0
- package/src/lib/server/dynamic-list-materialize.d.ts +153 -0
- package/src/lib/server/dynamic-list-materialize.js +581 -0
- package/src/lib/server/dynamic-list-materialize.js.map +1 -0
- package/src/lib/server/edit-access-authz.d.ts +56 -0
- package/src/lib/server/edit-access-authz.js +107 -0
- package/src/lib/server/edit-access-authz.js.map +1 -0
- package/src/lib/server/edit-access-token.d.ts +72 -0
- package/src/lib/server/edit-access-token.js +116 -0
- package/src/lib/server/edit-access-token.js.map +1 -0
- package/src/lib/server/edit-hint-token.d.ts +83 -0
- package/src/lib/server/edit-hint-token.js +119 -0
- package/src/lib/server/edit-hint-token.js.map +1 -0
- package/src/lib/server/email-delivery-log.d.ts +509 -0
- package/src/lib/server/email-delivery-log.js +1043 -0
- package/src/lib/server/email-delivery-log.js.map +1 -0
- package/src/lib/server/email-flow-gate.d.ts +80 -0
- package/src/lib/server/email-flow-gate.js +153 -0
- package/src/lib/server/email-flow-gate.js.map +1 -0
- package/src/lib/server/email-marketing-gate.d.ts +333 -0
- package/src/lib/server/email-marketing-gate.js +639 -0
- package/src/lib/server/email-marketing-gate.js.map +1 -0
- package/src/lib/server/email-metering.d.ts +293 -0
- package/src/lib/server/email-metering.js +359 -0
- package/src/lib/server/email-metering.js.map +1 -0
- package/src/lib/server/email-revenue-attribution.d.ts +185 -0
- package/src/lib/server/email-revenue-attribution.js +300 -0
- package/src/lib/server/email-revenue-attribution.js.map +1 -0
- package/src/lib/server/email-send-rate.d.ts +232 -0
- package/src/lib/server/email-send-rate.js +417 -0
- package/src/lib/server/email-send-rate.js.map +1 -0
- package/src/lib/server/email-sender-reputation.d.ts +317 -0
- package/src/lib/server/email-sender-reputation.js +464 -0
- package/src/lib/server/email-sender-reputation.js.map +1 -0
- package/src/lib/server/email-suppression.d.ts +490 -0
- package/src/lib/server/email-suppression.js +648 -0
- package/src/lib/server/email-suppression.js.map +1 -0
- package/src/lib/server/email-topic-confirmation.d.ts +150 -0
- package/src/lib/server/email-topic-confirmation.js +272 -0
- package/src/lib/server/email-topic-confirmation.js.map +1 -0
- package/src/lib/server/email-unsubscribe-link.d.ts +174 -0
- package/src/lib/server/email-unsubscribe-link.js +236 -0
- package/src/lib/server/email-unsubscribe-link.js.map +1 -0
- package/src/lib/server/erase-person.d.ts +116 -0
- package/src/lib/server/erase-person.js +272 -0
- package/src/lib/server/erase-person.js.map +1 -0
- package/src/lib/server/erase.d.ts +458 -0
- package/src/lib/server/erase.js +1506 -0
- package/src/lib/server/erase.js.map +1 -0
- package/src/lib/server/firebase-admin.d.ts +71 -0
- package/src/lib/server/firebase-admin.js +343 -0
- package/src/lib/server/firebase-admin.js.map +1 -0
- package/src/lib/server/form-dataset-binding-token.d.ts +35 -0
- package/src/lib/server/form-dataset-binding-token.js +107 -0
- package/src/lib/server/form-dataset-binding-token.js.map +1 -0
- package/src/lib/server/free-workspace-cap.d.ts +201 -0
- package/src/lib/server/free-workspace-cap.js +404 -0
- package/src/lib/server/free-workspace-cap.js.map +1 -0
- package/src/lib/server/ga4-measurement-protocol.d.ts +256 -0
- package/src/lib/server/ga4-measurement-protocol.js +558 -0
- package/src/lib/server/ga4-measurement-protocol.js.map +1 -0
- package/src/lib/server/host-email-tokens.d.ts +47 -0
- package/src/lib/server/host-email-tokens.js +72 -0
- package/src/lib/server/host-email-tokens.js.map +1 -0
- package/src/lib/server/host-memberships.d.ts +54 -0
- package/src/lib/server/host-memberships.js +194 -0
- package/src/lib/server/host-memberships.js.map +1 -0
- package/src/lib/server/host-sending-domain.d.ts +292 -0
- package/src/lib/server/host-sending-domain.js +451 -0
- package/src/lib/server/host-sending-domain.js.map +1 -0
- package/src/lib/server/host-visitor-records.d.ts +150 -0
- package/src/lib/server/host-visitor-records.js +262 -0
- package/src/lib/server/host-visitor-records.js.map +1 -0
- package/src/lib/server/id-token-refusal.d.ts +28 -0
- package/src/lib/server/id-token-refusal.js +111 -0
- package/src/lib/server/id-token-refusal.js.map +1 -0
- package/src/lib/server/legal-acceptance.d.ts +214 -0
- package/src/lib/server/legal-acceptance.js +305 -0
- package/src/lib/server/legal-acceptance.js.map +1 -0
- package/src/lib/server/list-members.d.ts +211 -0
- package/src/lib/server/list-members.js +176 -0
- package/src/lib/server/list-members.js.map +1 -0
- package/src/lib/server/live-page-usage.d.ts +202 -0
- package/src/lib/server/live-page-usage.js +300 -0
- package/src/lib/server/live-page-usage.js.map +1 -0
- package/src/lib/server/lockdown.d.ts +313 -0
- package/src/lib/server/lockdown.js +643 -0
- package/src/lib/server/lockdown.js.map +1 -0
- package/src/lib/server/media-cdn-rate-limit.d.ts +188 -0
- package/src/lib/server/media-cdn-rate-limit.js +204 -0
- package/src/lib/server/media-cdn-rate-limit.js.map +1 -0
- package/src/lib/server/media-delivery.d.ts +267 -0
- package/src/lib/server/media-delivery.js +485 -0
- package/src/lib/server/media-delivery.js.map +1 -0
- package/src/lib/server/media-download-tokens.d.ts +161 -0
- package/src/lib/server/media-download-tokens.js +386 -0
- package/src/lib/server/media-download-tokens.js.map +1 -0
- package/src/lib/server/media-quarantine.d.ts +127 -0
- package/src/lib/server/media-quarantine.js +170 -0
- package/src/lib/server/media-quarantine.js.map +1 -0
- package/src/lib/server/media-signing.d.ts +126 -0
- package/src/lib/server/media-signing.js +159 -0
- package/src/lib/server/media-signing.js.map +1 -0
- package/src/lib/server/media-storage-path.d.ts +96 -0
- package/src/lib/server/media-storage-path.js +111 -0
- package/src/lib/server/media-storage-path.js.map +1 -0
- package/src/lib/server/media-strong-digest.d.ts +85 -0
- package/src/lib/server/media-strong-digest.js +190 -0
- package/src/lib/server/media-strong-digest.js.map +1 -0
- package/src/lib/server/media-tombstone.d.ts +276 -0
- package/src/lib/server/media-tombstone.js +421 -0
- package/src/lib/server/media-tombstone.js.map +1 -0
- package/src/lib/server/media-variants.d.ts +309 -0
- package/src/lib/server/media-variants.js +428 -0
- package/src/lib/server/media-variants.js.map +1 -0
- package/src/lib/server/member-email-aliases.d.ts +180 -0
- package/src/lib/server/member-email-aliases.js +420 -0
- package/src/lib/server/member-email-aliases.js.map +1 -0
- package/src/lib/server/member-photo.d.ts +88 -0
- package/src/lib/server/member-photo.js +185 -0
- package/src/lib/server/member-photo.js.map +1 -0
- package/src/lib/server/membership-recover-throttle.d.ts +211 -0
- package/src/lib/server/membership-recover-throttle.js +231 -0
- package/src/lib/server/membership-recover-throttle.js.map +1 -0
- package/src/lib/server/notifications.d.ts +55 -0
- package/src/lib/server/notifications.js +134 -0
- package/src/lib/server/notifications.js.map +1 -0
- package/src/lib/server/org-billing.d.ts +97 -0
- package/src/lib/server/org-billing.js +236 -0
- package/src/lib/server/org-billing.js.map +1 -0
- package/src/lib/server/organizations.d.ts +837 -0
- package/src/lib/server/organizations.js +1814 -0
- package/src/lib/server/organizations.js.map +1 -0
- package/src/lib/server/password-reset-throttle.d.ts +84 -0
- package/src/lib/server/password-reset-throttle.js +102 -0
- package/src/lib/server/password-reset-throttle.js.map +1 -0
- package/src/lib/server/personal-data-export.d.ts +241 -0
- package/src/lib/server/personal-data-export.js +858 -0
- package/src/lib/server/personal-data-export.js.map +1 -0
- package/src/lib/server/platform-domain-names.d.ts +62 -0
- package/src/lib/server/platform-domain-names.js +197 -0
- package/src/lib/server/platform-domain-names.js.map +1 -0
- package/src/lib/server/platform-marketing-consent.d.ts +133 -0
- package/src/lib/server/platform-marketing-consent.js +209 -0
- package/src/lib/server/platform-marketing-consent.js.map +1 -0
- package/src/lib/server/rate-limit-store.d.ts +702 -0
- package/src/lib/server/rate-limit-store.js +1220 -0
- package/src/lib/server/rate-limit-store.js.map +1 -0
- package/src/lib/server/realm-plugins.d.ts +67 -0
- package/src/lib/server/realm-plugins.js +250 -0
- package/src/lib/server/realm-plugins.js.map +1 -0
- package/src/lib/server/recaptcha-allowlist.d.ts +90 -0
- package/src/lib/server/recaptcha-allowlist.js +409 -0
- package/src/lib/server/recaptcha-allowlist.js.map +1 -0
- package/src/lib/server/release-flags.d.ts +105 -0
- package/src/lib/server/release-flags.js +183 -0
- package/src/lib/server/release-flags.js.map +1 -0
- package/src/lib/server/replay-erasures.d.ts +126 -0
- package/src/lib/server/replay-erasures.js +217 -0
- package/src/lib/server/replay-erasures.js.map +1 -0
- package/src/lib/server/resolve-people.d.ts +66 -0
- package/src/lib/server/resolve-people.js +112 -0
- package/src/lib/server/resolve-people.js.map +1 -0
- package/src/lib/server/safe-equal.d.ts +45 -0
- package/src/lib/server/safe-equal.js +58 -0
- package/src/lib/server/safe-equal.js.map +1 -0
- package/src/lib/server/sending-domain-debt.d.ts +127 -0
- package/src/lib/server/sending-domain-debt.js +268 -0
- package/src/lib/server/sending-domain-debt.js.map +1 -0
- package/src/lib/server/sending-domain-recheck.d.ts +151 -0
- package/src/lib/server/sending-domain-recheck.js +253 -0
- package/src/lib/server/sending-domain-recheck.js.map +1 -0
- package/src/lib/server/sending-domains.d.ts +364 -0
- package/src/lib/server/sending-domains.js +683 -0
- package/src/lib/server/sending-domains.js.map +1 -0
- package/src/lib/server/serve-media-cdn.d.ts +433 -0
- package/src/lib/server/serve-media-cdn.js +1370 -0
- package/src/lib/server/serve-media-cdn.js.map +1 -0
- package/src/lib/server/serve-plugin-fetch.d.ts +61 -0
- package/src/lib/server/serve-plugin-fetch.js +294 -0
- package/src/lib/server/serve-plugin-fetch.js.map +1 -0
- package/src/lib/server/sms-keywords.d.ts +63 -0
- package/src/lib/server/sms-keywords.js +146 -0
- package/src/lib/server/sms-keywords.js.map +1 -0
- package/src/lib/server/sso-break-glass-owners.d.ts +91 -0
- package/src/lib/server/sso-break-glass-owners.js +227 -0
- package/src/lib/server/sso-break-glass-owners.js.map +1 -0
- package/src/lib/server/sso-domain-policy.d.ts +140 -0
- package/src/lib/server/sso-domain-policy.js +239 -0
- package/src/lib/server/sso-domain-policy.js.map +1 -0
- package/src/lib/server/sso-drift-logic.d.ts +106 -0
- package/src/lib/server/sso-drift-logic.js +95 -0
- package/src/lib/server/sso-drift-logic.js.map +1 -0
- package/src/lib/server/sso-enforcement.d.ts +204 -0
- package/src/lib/server/sso-enforcement.js +309 -0
- package/src/lib/server/sso-enforcement.js.map +1 -0
- package/src/lib/server/sso-provisioning.d.ts +320 -0
- package/src/lib/server/sso-provisioning.js +715 -0
- package/src/lib/server/sso-provisioning.js.map +1 -0
- package/src/lib/server/staff-alert-email.d.ts +41 -0
- package/src/lib/server/staff-alert-email.js +63 -0
- package/src/lib/server/staff-alert-email.js.map +1 -0
- package/src/lib/server/stripe-account-mode.d.ts +156 -0
- package/src/lib/server/stripe-account-mode.js +162 -0
- package/src/lib/server/stripe-account-mode.js.map +1 -0
- package/src/lib/server/tenant-write-lockdown.d.ts +131 -0
- package/src/lib/server/tenant-write-lockdown.js +176 -0
- package/src/lib/server/tenant-write-lockdown.js.map +1 -0
- package/src/lib/server/test-firestore.d.ts +45 -0
- package/src/lib/server/test-firestore.js +124 -0
- package/src/lib/server/test-firestore.js.map +1 -0
- package/src/lib/server/token-revocation.d.ts +140 -0
- package/src/lib/server/token-revocation.js +255 -0
- package/src/lib/server/token-revocation.js.map +1 -0
- package/src/lib/server/update-existing.d.ts +32 -0
- package/src/lib/server/update-existing.js +73 -0
- package/src/lib/server/update-existing.js.map +1 -0
- package/src/lib/server/upload-cors-reconcile.d.ts +118 -0
- package/src/lib/server/upload-cors-reconcile.js +234 -0
- package/src/lib/server/upload-cors-reconcile.js.map +1 -0
- package/src/lib/server/upsert-contact.d.ts +262 -0
- package/src/lib/server/upsert-contact.js +546 -0
- package/src/lib/server/upsert-contact.js.map +1 -0
- package/src/lib/server/usage-invoice.d.ts +203 -0
- package/src/lib/server/usage-invoice.js +397 -0
- package/src/lib/server/usage-invoice.js.map +1 -0
- package/src/lib/server/user-profiles.d.ts +151 -0
- package/src/lib/server/user-profiles.js +364 -0
- package/src/lib/server/user-profiles.js.map +1 -0
- package/src/lib/server/vercel-drain-signature.d.ts +30 -0
- package/src/lib/server/vercel-drain-signature.js +61 -0
- package/src/lib/server/vercel-drain-signature.js.map +1 -0
- package/src/lib/server/vercel-log-drain.d.ts +259 -0
- package/src/lib/server/vercel-log-drain.js +479 -0
- package/src/lib/server/vercel-log-drain.js.map +1 -0
- package/src/lib/server/verify-email-cooldown.d.ts +102 -0
- package/src/lib/server/verify-email-cooldown.js +114 -0
- package/src/lib/server/verify-email-cooldown.js.map +1 -0
- package/src/lib/server/visitor-write-rate-limit.d.ts +87 -0
- package/src/lib/server/visitor-write-rate-limit.js +117 -0
- package/src/lib/server/visitor-write-rate-limit.js.map +1 -0
- package/src/lib/server/workspace-domains.d.ts +156 -0
- package/src/lib/server/workspace-domains.js +271 -0
- package/src/lib/server/workspace-domains.js.map +1 -0
- package/src/tenancy.d.ts +115 -0
- package/src/tenancy.js +142 -0
- package/src/tenancy.js.map +1 -0
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Cross-pool Firebase Auth lookups (AGL-1122).
|
|
19
|
+
*
|
|
20
|
+
* Enterprise SSO (AGL-1101) signs users into a per-org **GCIP tenant**, and a
|
|
21
|
+
* tenant has its OWN user pool. A project-level `getUserByEmail` /
|
|
22
|
+
* `listUsers` does not see those users at all — measured on aglyn-main:
|
|
23
|
+
* the owner of aglyn-org returned `auth/user-not-found` at project level and
|
|
24
|
+
* was present only under tenant `aglyn-org-y5v14`.
|
|
25
|
+
*
|
|
26
|
+
* That silently broke five separate things: staff could not find, view,
|
|
27
|
+
* disable or grant staff to an SSO user; adding one to an org or a site by
|
|
28
|
+
* email 404'd into "send them an invite" for an account that already exists;
|
|
29
|
+
* and `notifyStaff` skipped SSO staff entirely. Fixing those one route at a
|
|
30
|
+
* time would guarantee the next new route reintroduces the bug, so every
|
|
31
|
+
* caller goes through here instead.
|
|
32
|
+
*
|
|
33
|
+
* Custom claims are per-pool too: `setCustomUserClaims` on the project pool
|
|
34
|
+
* cannot grant staff to a tenant user. `authForPool` hands back the right
|
|
35
|
+
* `BaseAuth` so a mutation lands in the pool the user actually lives in.
|
|
36
|
+
*/
|
|
37
|
+
import type { BaseAuth, UserRecord } from 'firebase-admin/auth';
|
|
38
|
+
/** A user plus the pool they were found in (`null` = the project pool). */
|
|
39
|
+
export interface PooledUserRecord {
|
|
40
|
+
record: UserRecord;
|
|
41
|
+
/** GCIP tenant id, or null when the user is in the project-level pool. */
|
|
42
|
+
tenantId: string | null;
|
|
43
|
+
/**
|
|
44
|
+
* Other pools that ALSO hold this uid (AGL-1962). Normally absent: a uid is
|
|
45
|
+
* unique within a pool, and the pools are meant to hold different people.
|
|
46
|
+
*
|
|
47
|
+
* It is populated when the same uid turns up in more than one pool, which
|
|
48
|
+
* means something minted a custom token for one pool's uid against another
|
|
49
|
+
* pool — `signInWithCustomToken` CREATES the account when the uid is absent,
|
|
50
|
+
* so the mistake manufactures an empty shadow account rather than failing.
|
|
51
|
+
* Measured on production: `QQ7fixtureUid0000000000000001` existed in both the
|
|
52
|
+
* project pool and `aglyn-org-y5v14`, the project copy created by
|
|
53
|
+
* `/api/presence/token` minting an SSO user's tenant uid at project level.
|
|
54
|
+
*
|
|
55
|
+
* This is the marker, not a deletion: `listUsersAcrossPools` still returns
|
|
56
|
+
* every record, and `collapseCrossPoolUidRows` — which is what a display
|
|
57
|
+
* uses — keeps this field on the row it keeps, so a collision is still
|
|
58
|
+
* legible after the rows are merged (AGL-2005).
|
|
59
|
+
*/
|
|
60
|
+
uidAlsoInPools?: (string | null)[];
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Does this record show that a human ever authenticated as it? (AGL-2005)
|
|
64
|
+
*
|
|
65
|
+
* An address or a provider entry is the evidence. `signInWithCustomToken`
|
|
66
|
+
* mints an account out of nothing when the uid is absent from the pool the
|
|
67
|
+
* token was minted in, and the record it manufactures has neither: measured
|
|
68
|
+
* on production, a project-pool twin of a tenant uid had `email: null` and
|
|
69
|
+
* `providerData: []` while the real SSO record carried both an address and
|
|
70
|
+
* `saml.aglyn-workspace`.
|
|
71
|
+
*
|
|
72
|
+
* `displayName` and custom claims deliberately do NOT count. Both can be
|
|
73
|
+
* written onto any record after the fact — `updateProfile` and `grantStaff`
|
|
74
|
+
* in the staff console do exactly that — so a shadow that a staff action had
|
|
75
|
+
* already landed on would start qualifying as an identity and go on winning
|
|
76
|
+
* the lookups it should be losing. The bar has to be a signal the forgery
|
|
77
|
+
* cannot acquire by being acted upon.
|
|
78
|
+
*/
|
|
79
|
+
export declare function isIdentifiedUserRecord(record: UserRecord): boolean;
|
|
80
|
+
/**
|
|
81
|
+
* How strongly a record identifies its human, for choosing between two that
|
|
82
|
+
* share a uid (AGL-2005). Ordering only — the numbers have no other meaning.
|
|
83
|
+
*
|
|
84
|
+
* Email and provider data lead because they are what `isIdentifiedUserRecord`
|
|
85
|
+
* trusts; the rest break ties between records that both qualify.
|
|
86
|
+
*/
|
|
87
|
+
export declare function identityStrength(record: UserRecord): number;
|
|
88
|
+
/**
|
|
89
|
+
* Collapse rows sharing a uid to ONE row apiece (AGL-2005).
|
|
90
|
+
*
|
|
91
|
+
* **decided:** "We still have two users list in this list with the
|
|
92
|
+
* same uid but one without an email attached, this needs fixed we should only
|
|
93
|
+
* see one user, even if they are sso."
|
|
94
|
+
*
|
|
95
|
+
* AGL-1962 deliberately refused to merge, on the grounds that collapsing two
|
|
96
|
+
* accounts could hide an identity split. That reasoning still stands for two
|
|
97
|
+
* DISTINCT accounts — which is why this keys on **uid** and never on email.
|
|
98
|
+
* Two people who happen to share an address are two accounts with two uids
|
|
99
|
+
* and stay two rows; merging them on email would delete a real user from the
|
|
100
|
+
* staff console, a worse bug than the one being fixed and an invisible one.
|
|
101
|
+
*
|
|
102
|
+
* A repeated uid is different in kind: a uid is unique WITHIN a pool, so the
|
|
103
|
+
* same uid in two pools is not two people, it is one person plus an artifact
|
|
104
|
+
* of a cross-pool custom-token mint. Those merge.
|
|
105
|
+
*
|
|
106
|
+
* Two rules make the merge safe:
|
|
107
|
+
*
|
|
108
|
+
* - **The identified record wins.** Ranked by `identityStrength`, so an
|
|
109
|
+
* emailless, providerless artifact can never be the row staff see — the
|
|
110
|
+
* exact inversion that let the shadow win every uid lookup.
|
|
111
|
+
* - **The collision is not discarded.** `markCrossPoolUidCollisions` runs
|
|
112
|
+
* here rather than being left to the caller, so the surviving row always
|
|
113
|
+
* carries `uidAlsoInPools` naming the pools that were folded into it. One
|
|
114
|
+
* row, and it still says it was two.
|
|
115
|
+
*
|
|
116
|
+
* The survivor takes the FIRST occurrence's position so list ordering does
|
|
117
|
+
* not shuffle, and ties keep the earlier row so the result is deterministic.
|
|
118
|
+
*/
|
|
119
|
+
export declare function collapseCrossPoolUidRows(users: PooledUserRecord[]): PooledUserRecord[];
|
|
120
|
+
/**
|
|
121
|
+
* Flag every uid that appears in more than one pool, in place of hiding it.
|
|
122
|
+
*
|
|
123
|
+
* Pure and total, so a spec can drive it without Firebase. Callers must pass
|
|
124
|
+
* the rows they intend to show together — a collision it cannot see is one
|
|
125
|
+
* it cannot report.
|
|
126
|
+
*/
|
|
127
|
+
export declare function markCrossPoolUidCollisions(users: PooledUserRecord[]): PooledUserRecord[];
|
|
128
|
+
export declare function listAuthTenantIds(): Promise<string[]>;
|
|
129
|
+
/** Test seam — drops the tenant cache so a spec can vary the tenant set. */
|
|
130
|
+
export declare function resetAuthTenantCache(): void;
|
|
131
|
+
/** The `BaseAuth` for a pool: the project pool for null, else the tenant's. */
|
|
132
|
+
export declare function authForPool(tenantId: string | null | undefined): BaseAuth;
|
|
133
|
+
/**
|
|
134
|
+
* Find a user by email across the project pool and every GCIP tenant.
|
|
135
|
+
*
|
|
136
|
+
* The project pool is tried first — it holds every non-SSO user, which is
|
|
137
|
+
* almost all of them, so the common case stays a single call. Returns null
|
|
138
|
+
* when no pool has the address, which is the only honest answer for "this
|
|
139
|
+
* person has no Aglyn account".
|
|
140
|
+
*/
|
|
141
|
+
export declare function findUserByEmailAcrossPools(email: string): Promise<PooledUserRecord | null>;
|
|
142
|
+
/**
|
|
143
|
+
* Find a user by uid across the project pool and every GCIP tenant. Same
|
|
144
|
+
* shape as the email lookup — a uid is only unique WITHIN a pool, so the
|
|
145
|
+
* caller needs to know which pool answered before it mutates anything.
|
|
146
|
+
*
|
|
147
|
+
* **First pool to answer is NOT good enough** (AGL-2005). This used to return
|
|
148
|
+
* the project pool's record the moment it existed, which is how a forged
|
|
149
|
+
* emailless twin won every uid lookup for a real SSO user: `grantStaff`,
|
|
150
|
+
* `disable`, `setRole`, `updateProfile`, `revokeRefreshTokens`, impersonate,
|
|
151
|
+
* usage-email, resolve-people, org-lockdown and erasure all landed on a
|
|
152
|
+
* record nobody can sign in as. Two of those were caught having happened —
|
|
153
|
+
* a `revokeRefreshTokens` dated 2026-08-14 sat on the twin while the real
|
|
154
|
+
* account's `tokensValidAfterTime` never moved, so "sign out everywhere" did
|
|
155
|
+
* nothing at all.
|
|
156
|
+
*
|
|
157
|
+
* So a pool's answer is accepted only when the record it returns actually
|
|
158
|
+
* identifies someone, and the winner is chosen by the SAME rule the staff
|
|
159
|
+
* list collapses rows with. That equivalence is the point: the row staff
|
|
160
|
+
* click is the record the action mutates, by construction rather than by
|
|
161
|
+
* coincidence.
|
|
162
|
+
*
|
|
163
|
+
* The fast path survives intact — a project account with an address or a
|
|
164
|
+
* provider is returned without any tenant call, which is nearly every
|
|
165
|
+
* account. Only a record carrying no identity at all pays for the sweep.
|
|
166
|
+
*/
|
|
167
|
+
export declare function findUserByUidAcrossPools(uid: string): Promise<PooledUserRecord | null>;
|
|
168
|
+
export interface PooledUserPage {
|
|
169
|
+
users: PooledUserRecord[];
|
|
170
|
+
/** Project-pool cursor; null when the project pool is exhausted. */
|
|
171
|
+
nextPageToken: string | null;
|
|
172
|
+
/**
|
|
173
|
+
* True once the project pool is exhausted and the tenant users have been
|
|
174
|
+
* appended. Tenant pools are NOT paginated here — enterprise SSO pools are
|
|
175
|
+
* small, and silently dropping their tail would recreate exactly the
|
|
176
|
+
* invisibility this module exists to fix. `tenantTruncated` says when that
|
|
177
|
+
* assumption stopped holding rather than letting it fail quietly.
|
|
178
|
+
*/
|
|
179
|
+
tenantsIncluded: boolean;
|
|
180
|
+
/** Tenants whose users hit the cap and were cut short. */
|
|
181
|
+
tenantTruncated: string[];
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* One page of users across every pool: the project pool paginates as before,
|
|
185
|
+
* and tenant users are appended on the LAST page so they can never be lost
|
|
186
|
+
* between cursors. Callers render `tenantId` so an SSO account is
|
|
187
|
+
* recognisable — it is not editable the same way a project user is.
|
|
188
|
+
*/
|
|
189
|
+
export declare function listUsersAcrossPools(pageSize: number, pageToken?: string): Promise<PooledUserPage>;
|
|
190
|
+
/**
|
|
191
|
+
* Every account across every pool, up to a cap — the only way to FILTER them.
|
|
192
|
+
*
|
|
193
|
+
* Firebase Auth's `listUsers` takes a page size and a cursor and nothing else:
|
|
194
|
+
* no predicate, no ordering, no search. So a staff filter on anything but an
|
|
195
|
+
* exact email, uid or phone number (which have their own O(1) lookups) can
|
|
196
|
+
* only be answered by reading the accounts and matching them.
|
|
197
|
+
*
|
|
198
|
+
* That is an expensive read, so it happens on an ASK and never on a mount —
|
|
199
|
+
* the route calls this only when a request carries a filter, and pages the
|
|
200
|
+
* cheap way otherwise.
|
|
201
|
+
*
|
|
202
|
+
* `truncated` is true when the cap was reached, and it must be shown rather
|
|
203
|
+
* than swallowed: a staff list that searched part of the directory and said
|
|
204
|
+
* "no matches" is worse than one that admits where it stopped.
|
|
205
|
+
*/
|
|
206
|
+
export declare function scanUsersAcrossPools(cap: number): Promise<{
|
|
207
|
+
users: PooledUserRecord[];
|
|
208
|
+
truncated: boolean;
|
|
209
|
+
tenantTruncated: string[];
|
|
210
|
+
}>;
|
|
211
|
+
/** Where a claim mutation landed, so a caller can audit the POOL as well. */
|
|
212
|
+
export interface StaffClaimWrite {
|
|
213
|
+
uid: string;
|
|
214
|
+
/** The pool the claim was written to; null = the project pool. */
|
|
215
|
+
tenantId: string | null;
|
|
216
|
+
email: string | null;
|
|
217
|
+
claims: Record<string, unknown>;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Write custom claims to the pool the uid ACTUALLY lives in (AGL-1993).
|
|
221
|
+
*
|
|
222
|
+
* The hazard this exists to remove: `setCustomUserClaims` is per-pool, and a
|
|
223
|
+
* grant aimed at the wrong pool does not error — on the project pool it
|
|
224
|
+
* either throws `user-not-found` (loud, fine) or, when a phantom shadow record
|
|
225
|
+
* shares the uid, silently succeeds against the WRONG record. That is not
|
|
226
|
+
* hypothetical: on 2026-08-18 a staff account's uid existed in both the
|
|
227
|
+
* project pool and `aglyn-org-y5v14` at once. That phantom won every lookup
|
|
228
|
+
* until AGL-2005 made {@link findUserByUidAcrossPools} rank an IDENTIFIED
|
|
229
|
+
* record above an unidentified one rather than taking the first pool to
|
|
230
|
+
* answer.
|
|
231
|
+
*
|
|
232
|
+
* So resolution and mutation are bound together here rather than left to each
|
|
233
|
+
* caller to pair correctly, and the resolved pool is RETURNED so the audit row
|
|
234
|
+
* can record which pool was written — "granted staff to uid X" is not a
|
|
235
|
+
* complete record when a uid can name two accounts.
|
|
236
|
+
*
|
|
237
|
+
* Never assumes a pool. Staff may live in the project pool, in Aglyn's own
|
|
238
|
+
* tenant, or in a CUSTOMER org's tenant, and hard-coding any of them would
|
|
239
|
+
* silently fail the moment a third exists.
|
|
240
|
+
*/
|
|
241
|
+
export declare function setClaimsInOwningPool(uid: string, claims: Record<string, unknown>): Promise<StaffClaimWrite | null>;
|
|
242
|
+
/**
|
|
243
|
+
* Every uid carrying the `staff` claim, across all pools. Staff is a custom
|
|
244
|
+
* claim, which is not queryable, so this scans — the caller caches it.
|
|
245
|
+
*/
|
|
246
|
+
export declare function listStaffUidsAcrossPools(): Promise<string[]>;
|