@oxy.so/core 1.0.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/LICENSE +202 -0
- package/NOTICE +16 -0
- package/README.md +221 -0
- package/dist/cjs/.tsbuildinfo +1 -0
- package/dist/cjs/HttpService.js +1270 -0
- package/dist/cjs/OxyServices.base.js +390 -0
- package/dist/cjs/OxyServices.errors.js +95 -0
- package/dist/cjs/OxyServices.js +72 -0
- package/dist/cjs/boot/sessionColdBoot.js +395 -0
- package/dist/cjs/constants/version.js +16 -0
- package/dist/cjs/crypto/aead.js +79 -0
- package/dist/cjs/crypto/ecdh.js +35 -0
- package/dist/cjs/crypto/identityMarker.js +255 -0
- package/dist/cjs/crypto/kdf.js +39 -0
- package/dist/cjs/crypto/keyManager.js +2234 -0
- package/dist/cjs/crypto/polyfill.js +131 -0
- package/dist/cjs/crypto/recoveryPhrase.js +242 -0
- package/dist/cjs/crypto/signatureService.js +273 -0
- package/dist/cjs/i18n/accountCategoryLabels.js +44 -0
- package/dist/cjs/i18n/accountRoleLabels.js +27 -0
- package/dist/cjs/i18n/index.js +90 -0
- package/dist/cjs/i18n/locales/ar-SA.json +282 -0
- package/dist/cjs/i18n/locales/ca-ES.json +282 -0
- package/dist/cjs/i18n/locales/de-DE.json +282 -0
- package/dist/cjs/i18n/locales/en-US.json +2161 -0
- package/dist/cjs/i18n/locales/es-ES.json +2161 -0
- package/dist/cjs/i18n/locales/fr-FR.json +282 -0
- package/dist/cjs/i18n/locales/it-IT.json +282 -0
- package/dist/cjs/i18n/locales/ja-JP.json +282 -0
- package/dist/cjs/i18n/locales/ko-KR.json +282 -0
- package/dist/cjs/i18n/locales/locales/ar-SA.json +282 -0
- package/dist/cjs/i18n/locales/locales/ca-ES.json +282 -0
- package/dist/cjs/i18n/locales/locales/de-DE.json +282 -0
- package/dist/cjs/i18n/locales/locales/en-US.json +2161 -0
- package/dist/cjs/i18n/locales/locales/es-ES.json +2161 -0
- package/dist/cjs/i18n/locales/locales/fr-FR.json +282 -0
- package/dist/cjs/i18n/locales/locales/it-IT.json +282 -0
- package/dist/cjs/i18n/locales/locales/ja-JP.json +282 -0
- package/dist/cjs/i18n/locales/locales/ko-KR.json +282 -0
- package/dist/cjs/i18n/locales/locales/pt-PT.json +282 -0
- package/dist/cjs/i18n/locales/locales/zh-CN.json +282 -0
- package/dist/cjs/i18n/locales/pt-PT.json +282 -0
- package/dist/cjs/i18n/locales/zh-CN.json +282 -0
- package/dist/cjs/i18n/reputationCategoryLabels.js +20 -0
- package/dist/cjs/i18n/trustTierLabels.js +19 -0
- package/dist/cjs/index.js +498 -0
- package/dist/cjs/inference/OxyInferenceClient.js +544 -0
- package/dist/cjs/logger/index.js +149 -0
- package/dist/cjs/mixins/OxyServices.accounts.js +555 -0
- package/dist/cjs/mixins/OxyServices.analytics.js +49 -0
- package/dist/cjs/mixins/OxyServices.appData.js +108 -0
- package/dist/cjs/mixins/OxyServices.assets.js +764 -0
- package/dist/cjs/mixins/OxyServices.auth.js +1254 -0
- package/dist/cjs/mixins/OxyServices.chains.js +73 -0
- package/dist/cjs/mixins/OxyServices.civic.js +611 -0
- package/dist/cjs/mixins/OxyServices.connectedApps.js +78 -0
- package/dist/cjs/mixins/OxyServices.contacts.js +50 -0
- package/dist/cjs/mixins/OxyServices.deviceBoot.js +191 -0
- package/dist/cjs/mixins/OxyServices.deviceTransfer.js +314 -0
- package/dist/cjs/mixins/OxyServices.devices.js +116 -0
- package/dist/cjs/mixins/OxyServices.features.js +335 -0
- package/dist/cjs/mixins/OxyServices.followGraph.js +221 -0
- package/dist/cjs/mixins/OxyServices.identity.js +461 -0
- package/dist/cjs/mixins/OxyServices.identityBackup.js +172 -0
- package/dist/cjs/mixins/OxyServices.inference.js +59 -0
- package/dist/cjs/mixins/OxyServices.language.js +125 -0
- package/dist/cjs/mixins/OxyServices.links.js +72 -0
- package/dist/cjs/mixins/OxyServices.location.js +43 -0
- package/dist/cjs/mixins/OxyServices.nodes.js +175 -0
- package/dist/cjs/mixins/OxyServices.notifications.js +63 -0
- package/dist/cjs/mixins/OxyServices.payment.js +158 -0
- package/dist/cjs/mixins/OxyServices.privacy.js +199 -0
- package/dist/cjs/mixins/OxyServices.reputation.js +289 -0
- package/dist/cjs/mixins/OxyServices.security.js +89 -0
- package/dist/cjs/mixins/OxyServices.store.js +266 -0
- package/dist/cjs/mixins/OxyServices.topics.js +137 -0
- package/dist/cjs/mixins/OxyServices.user.js +902 -0
- package/dist/cjs/mixins/OxyServices.utility.js +1098 -0
- package/dist/cjs/mixins/index.js +135 -0
- package/dist/cjs/mixins/mixinHelpers.js +53 -0
- package/dist/cjs/models/Topic.js +16 -0
- package/dist/cjs/models/interfaces.js +20 -0
- package/dist/cjs/models/session.js +2 -0
- package/dist/cjs/server/auth.js +167 -0
- package/dist/cjs/server/capabilityTicket.js +192 -0
- package/dist/cjs/server/cors.js +225 -0
- package/dist/cjs/server/index.js +97 -0
- package/dist/cjs/server/rateLimit.js +207 -0
- package/dist/cjs/server/safeFetch.js +458 -0
- package/dist/cjs/server/securityHeaders.js +377 -0
- package/dist/cjs/server/userInvalidation.js +156 -0
- package/dist/cjs/server/verifySecret.js +50 -0
- package/dist/cjs/session/SessionClient.js +865 -0
- package/dist/cjs/session/accountDelegationAccess.js +48 -0
- package/dist/cjs/session/accountDialogController.js +1131 -0
- package/dist/cjs/session/accountSwitchTargets.js +81 -0
- package/dist/cjs/session/authStateStore.js +404 -0
- package/dist/cjs/session/createSessionClient.js +32 -0
- package/dist/cjs/session/deviceDirectory.js +143 -0
- package/dist/cjs/session/deviceSwitcherRows.js +76 -0
- package/dist/cjs/session/identityPin.js +256 -0
- package/dist/cjs/session/identitySession.js +135 -0
- package/dist/cjs/session/projectSessionState.js +121 -0
- package/dist/cjs/session/refresh.js +398 -0
- package/dist/cjs/session/sessionClientHost.js +34 -0
- package/dist/cjs/session/sharedDeviceCredential.js +247 -0
- package/dist/cjs/session/socketLoader.js +55 -0
- package/dist/cjs/shared/utils/colorUtils.js +153 -0
- package/dist/cjs/shared/utils/errorUtils.js +183 -0
- package/dist/cjs/shared/utils/index.js +49 -0
- package/dist/cjs/shared/utils/networkUtils.js +183 -0
- package/dist/cjs/shared/utils/themeUtils.js +106 -0
- package/dist/cjs/utils/accountCacheSweep.js +80 -0
- package/dist/cjs/utils/accountUtils.js +140 -0
- package/dist/cjs/utils/activityId.js +6 -0
- package/dist/cjs/utils/apiUtils.js +91 -0
- package/dist/cjs/utils/asyncUtils.js +222 -0
- package/dist/cjs/utils/authHelpers.js +120 -0
- package/dist/cjs/utils/authWebUrl.js +19 -0
- package/dist/cjs/utils/avatarUtils.js +29 -0
- package/dist/cjs/utils/cache.js +235 -0
- package/dist/cjs/utils/cacheKey.js +85 -0
- package/dist/cjs/utils/coldBoot.js +122 -0
- package/dist/cjs/utils/commonsApproval.js +31 -0
- package/dist/cjs/utils/commonsDelivery.js +59 -0
- package/dist/cjs/utils/deviceManager.js +174 -0
- package/dist/cjs/utils/displayNamePolicyRanges.generated.js +60 -0
- package/dist/cjs/utils/edgeRegion.js +6 -0
- package/dist/cjs/utils/errorUtils.js +243 -0
- package/dist/cjs/utils/identityCacheSweep.js +97 -0
- package/dist/cjs/utils/languageUtils.js +224 -0
- package/dist/cjs/utils/oauthPkce.js +311 -0
- package/dist/cjs/utils/officialOrigins.js +64 -0
- package/dist/cjs/utils/oxyServiceEnvironment.js +19 -0
- package/dist/cjs/utils/platform.js +119 -0
- package/dist/cjs/utils/profileLinks.js +63 -0
- package/dist/cjs/utils/redactUrl.js +29 -0
- package/dist/cjs/utils/registrableApex.js +45 -0
- package/dist/cjs/utils/requestUtils.js +209 -0
- package/dist/cjs/utils/sessionUtils.js +181 -0
- package/dist/cjs/utils/textNormalization.js +158 -0
- package/dist/cjs/utils/userHandle.js +37 -0
- package/dist/cjs/utils/userIdentity.js +50 -0
- package/dist/cjs/utils/validationUtils.js +370 -0
- package/dist/cjs/utils/webauthnOrigin.js +51 -0
- package/dist/esm/.tsbuildinfo +1 -0
- package/dist/esm/HttpService.js +1266 -0
- package/dist/esm/OxyServices.base.js +386 -0
- package/dist/esm/OxyServices.errors.js +88 -0
- package/dist/esm/OxyServices.js +66 -0
- package/dist/esm/boot/sessionColdBoot.js +392 -0
- package/dist/esm/constants/version.js +13 -0
- package/dist/esm/crypto/aead.js +74 -0
- package/dist/esm/crypto/ecdh.js +32 -0
- package/dist/esm/crypto/identityMarker.js +248 -0
- package/dist/esm/crypto/kdf.js +36 -0
- package/dist/esm/crypto/keyManager.js +2227 -0
- package/dist/esm/crypto/polyfill.js +129 -0
- package/dist/esm/crypto/recoveryPhrase.js +238 -0
- package/dist/esm/crypto/signatureService.js +269 -0
- package/dist/esm/i18n/accountCategoryLabels.js +37 -0
- package/dist/esm/i18n/accountRoleLabels.js +20 -0
- package/dist/esm/i18n/index.js +83 -0
- package/dist/esm/i18n/locales/ar-SA.json +282 -0
- package/dist/esm/i18n/locales/ca-ES.json +282 -0
- package/dist/esm/i18n/locales/de-DE.json +282 -0
- package/dist/esm/i18n/locales/en-US.json +2161 -0
- package/dist/esm/i18n/locales/es-ES.json +2161 -0
- package/dist/esm/i18n/locales/fr-FR.json +282 -0
- package/dist/esm/i18n/locales/it-IT.json +282 -0
- package/dist/esm/i18n/locales/ja-JP.json +282 -0
- package/dist/esm/i18n/locales/ko-KR.json +282 -0
- package/dist/esm/i18n/locales/locales/ar-SA.json +282 -0
- package/dist/esm/i18n/locales/locales/ca-ES.json +282 -0
- package/dist/esm/i18n/locales/locales/de-DE.json +282 -0
- package/dist/esm/i18n/locales/locales/en-US.json +2161 -0
- package/dist/esm/i18n/locales/locales/es-ES.json +2161 -0
- package/dist/esm/i18n/locales/locales/fr-FR.json +282 -0
- package/dist/esm/i18n/locales/locales/it-IT.json +282 -0
- package/dist/esm/i18n/locales/locales/ja-JP.json +282 -0
- package/dist/esm/i18n/locales/locales/ko-KR.json +282 -0
- package/dist/esm/i18n/locales/locales/pt-PT.json +282 -0
- package/dist/esm/i18n/locales/locales/zh-CN.json +282 -0
- package/dist/esm/i18n/locales/pt-PT.json +282 -0
- package/dist/esm/i18n/locales/zh-CN.json +282 -0
- package/dist/esm/i18n/reputationCategoryLabels.js +13 -0
- package/dist/esm/i18n/trustTierLabels.js +12 -0
- package/dist/esm/index.js +254 -0
- package/dist/esm/inference/OxyInferenceClient.js +538 -0
- package/dist/esm/logger/index.js +140 -0
- package/dist/esm/mixins/OxyServices.accounts.js +543 -0
- package/dist/esm/mixins/OxyServices.analytics.js +46 -0
- package/dist/esm/mixins/OxyServices.appData.js +103 -0
- package/dist/esm/mixins/OxyServices.assets.js +761 -0
- package/dist/esm/mixins/OxyServices.auth.js +1247 -0
- package/dist/esm/mixins/OxyServices.chains.js +70 -0
- package/dist/esm/mixins/OxyServices.civic.js +605 -0
- package/dist/esm/mixins/OxyServices.connectedApps.js +75 -0
- package/dist/esm/mixins/OxyServices.contacts.js +47 -0
- package/dist/esm/mixins/OxyServices.deviceBoot.js +186 -0
- package/dist/esm/mixins/OxyServices.deviceTransfer.js +311 -0
- package/dist/esm/mixins/OxyServices.devices.js +113 -0
- package/dist/esm/mixins/OxyServices.features.js +332 -0
- package/dist/esm/mixins/OxyServices.followGraph.js +218 -0
- package/dist/esm/mixins/OxyServices.identity.js +457 -0
- package/dist/esm/mixins/OxyServices.identityBackup.js +169 -0
- package/dist/esm/mixins/OxyServices.inference.js +56 -0
- package/dist/esm/mixins/OxyServices.language.js +122 -0
- package/dist/esm/mixins/OxyServices.links.js +69 -0
- package/dist/esm/mixins/OxyServices.location.js +40 -0
- package/dist/esm/mixins/OxyServices.nodes.js +172 -0
- package/dist/esm/mixins/OxyServices.notifications.js +60 -0
- package/dist/esm/mixins/OxyServices.payment.js +155 -0
- package/dist/esm/mixins/OxyServices.privacy.js +196 -0
- package/dist/esm/mixins/OxyServices.reputation.js +286 -0
- package/dist/esm/mixins/OxyServices.security.js +86 -0
- package/dist/esm/mixins/OxyServices.store.js +263 -0
- package/dist/esm/mixins/OxyServices.topics.js +134 -0
- package/dist/esm/mixins/OxyServices.user.js +899 -0
- package/dist/esm/mixins/OxyServices.utility.js +1095 -0
- package/dist/esm/mixins/index.js +132 -0
- package/dist/esm/mixins/mixinHelpers.js +48 -0
- package/dist/esm/models/Topic.js +13 -0
- package/dist/esm/models/interfaces.js +17 -0
- package/dist/esm/models/session.js +1 -0
- package/dist/esm/server/auth.js +154 -0
- package/dist/esm/server/capabilityTicket.js +183 -0
- package/dist/esm/server/cors.js +220 -0
- package/dist/esm/server/index.js +47 -0
- package/dist/esm/server/rateLimit.js +201 -0
- package/dist/esm/server/safeFetch.js +447 -0
- package/dist/esm/server/securityHeaders.js +364 -0
- package/dist/esm/server/userInvalidation.js +152 -0
- package/dist/esm/server/verifySecret.js +47 -0
- package/dist/esm/session/SessionClient.js +861 -0
- package/dist/esm/session/accountDelegationAccess.js +45 -0
- package/dist/esm/session/accountDialogController.js +1126 -0
- package/dist/esm/session/accountSwitchTargets.js +77 -0
- package/dist/esm/session/authStateStore.js +398 -0
- package/dist/esm/session/createSessionClient.js +29 -0
- package/dist/esm/session/deviceDirectory.js +135 -0
- package/dist/esm/session/deviceSwitcherRows.js +72 -0
- package/dist/esm/session/identityPin.js +249 -0
- package/dist/esm/session/identitySession.js +131 -0
- package/dist/esm/session/projectSessionState.js +114 -0
- package/dist/esm/session/refresh.js +390 -0
- package/dist/esm/session/sessionClientHost.js +31 -0
- package/dist/esm/session/sharedDeviceCredential.js +239 -0
- package/dist/esm/session/socketLoader.js +19 -0
- package/dist/esm/shared/utils/colorUtils.js +143 -0
- package/dist/esm/shared/utils/errorUtils.js +170 -0
- package/dist/esm/shared/utils/index.js +15 -0
- package/dist/esm/shared/utils/networkUtils.js +173 -0
- package/dist/esm/shared/utils/themeUtils.js +98 -0
- package/dist/esm/utils/accountCacheSweep.js +75 -0
- package/dist/esm/utils/accountUtils.js +131 -0
- package/dist/esm/utils/activityId.js +2 -0
- package/dist/esm/utils/apiUtils.js +84 -0
- package/dist/esm/utils/asyncUtils.js +207 -0
- package/dist/esm/utils/authHelpers.js +111 -0
- package/dist/esm/utils/authWebUrl.js +16 -0
- package/dist/esm/utils/avatarUtils.js +26 -0
- package/dist/esm/utils/cache.js +227 -0
- package/dist/esm/utils/cacheKey.js +80 -0
- package/dist/esm/utils/coldBoot.js +119 -0
- package/dist/esm/utils/commonsApproval.js +27 -0
- package/dist/esm/utils/commonsDelivery.js +54 -0
- package/dist/esm/utils/deviceManager.js +170 -0
- package/dist/esm/utils/displayNamePolicyRanges.generated.js +57 -0
- package/dist/esm/utils/edgeRegion.js +2 -0
- package/dist/esm/utils/errorUtils.js +232 -0
- package/dist/esm/utils/identityCacheSweep.js +92 -0
- package/dist/esm/utils/languageUtils.js +212 -0
- package/dist/esm/utils/oauthPkce.js +297 -0
- package/dist/esm/utils/officialOrigins.js +59 -0
- package/dist/esm/utils/oxyServiceEnvironment.js +16 -0
- package/dist/esm/utils/platform.js +110 -0
- package/dist/esm/utils/profileLinks.js +60 -0
- package/dist/esm/utils/redactUrl.js +26 -0
- package/dist/esm/utils/registrableApex.js +42 -0
- package/dist/esm/utils/requestUtils.js +203 -0
- package/dist/esm/utils/sessionUtils.js +171 -0
- package/dist/esm/utils/textNormalization.js +154 -0
- package/dist/esm/utils/userHandle.js +33 -0
- package/dist/esm/utils/userIdentity.js +45 -0
- package/dist/esm/utils/validationUtils.js +350 -0
- package/dist/esm/utils/webauthnOrigin.js +48 -0
- package/dist/types/.tsbuildinfo +1 -0
- package/dist/types/HttpService.d.ts +413 -0
- package/dist/types/OxyServices.base.d.ts +187 -0
- package/dist/types/OxyServices.d.ts +139 -0
- package/dist/types/OxyServices.errors.d.ts +84 -0
- package/dist/types/boot/sessionColdBoot.d.ts +140 -0
- package/dist/types/constants/version.d.ts +13 -0
- package/dist/types/crypto/aead.d.ts +56 -0
- package/dist/types/crypto/ecdh.d.ts +29 -0
- package/dist/types/crypto/identityMarker.d.ts +94 -0
- package/dist/types/crypto/kdf.d.ts +25 -0
- package/dist/types/crypto/keyManager.d.ts +582 -0
- package/dist/types/crypto/polyfill.d.ts +25 -0
- package/dist/types/crypto/recoveryPhrase.d.ts +173 -0
- package/dist/types/crypto/signatureService.d.ts +136 -0
- package/dist/types/i18n/accountCategoryLabels.d.ts +34 -0
- package/dist/types/i18n/accountRoleLabels.d.ts +10 -0
- package/dist/types/i18n/index.d.ts +3 -0
- package/dist/types/i18n/reputationCategoryLabels.d.ts +10 -0
- package/dist/types/i18n/trustTierLabels.d.ts +9 -0
- package/dist/types/index.d.ts +145 -0
- package/dist/types/inference/OxyInferenceClient.d.ts +342 -0
- package/dist/types/logger/index.d.ts +104 -0
- package/dist/types/mixins/OxyServices.accounts.d.ts +868 -0
- package/dist/types/mixins/OxyServices.analytics.d.ts +72 -0
- package/dist/types/mixins/OxyServices.appData.d.ts +108 -0
- package/dist/types/mixins/OxyServices.assets.d.ts +329 -0
- package/dist/types/mixins/OxyServices.auth.d.ts +908 -0
- package/dist/types/mixins/OxyServices.chains.d.ts +156 -0
- package/dist/types/mixins/OxyServices.civic.d.ts +510 -0
- package/dist/types/mixins/OxyServices.connectedApps.d.ts +169 -0
- package/dist/types/mixins/OxyServices.contacts.d.ts +100 -0
- package/dist/types/mixins/OxyServices.deviceBoot.d.ts +185 -0
- package/dist/types/mixins/OxyServices.deviceTransfer.d.ts +149 -0
- package/dist/types/mixins/OxyServices.devices.d.ts +103 -0
- package/dist/types/mixins/OxyServices.features.d.ts +250 -0
- package/dist/types/mixins/OxyServices.followGraph.d.ts +223 -0
- package/dist/types/mixins/OxyServices.identity.d.ts +351 -0
- package/dist/types/mixins/OxyServices.identityBackup.d.ts +129 -0
- package/dist/types/mixins/OxyServices.inference.d.ts +95 -0
- package/dist/types/mixins/OxyServices.language.d.ts +87 -0
- package/dist/types/mixins/OxyServices.links.d.ts +104 -0
- package/dist/types/mixins/OxyServices.location.d.ts +70 -0
- package/dist/types/mixins/OxyServices.nodes.d.ts +198 -0
- package/dist/types/mixins/OxyServices.notifications.d.ts +143 -0
- package/dist/types/mixins/OxyServices.payment.d.ts +117 -0
- package/dist/types/mixins/OxyServices.privacy.d.ts +146 -0
- package/dist/types/mixins/OxyServices.reputation.d.ts +202 -0
- package/dist/types/mixins/OxyServices.security.d.ts +84 -0
- package/dist/types/mixins/OxyServices.store.d.ts +334 -0
- package/dist/types/mixins/OxyServices.topics.d.ts +110 -0
- package/dist/types/mixins/OxyServices.user.d.ts +558 -0
- package/dist/types/mixins/OxyServices.utility.d.ts +393 -0
- package/dist/types/mixins/index.d.ts +87 -0
- package/dist/types/mixins/mixinHelpers.d.ts +31 -0
- package/dist/types/models/Topic.d.ts +42 -0
- package/dist/types/models/interfaces.d.ts +675 -0
- package/dist/types/models/session.d.ts +51 -0
- package/dist/types/server/auth.d.ts +130 -0
- package/dist/types/server/capabilityTicket.d.ts +41 -0
- package/dist/types/server/cors.d.ts +98 -0
- package/dist/types/server/index.d.ts +35 -0
- package/dist/types/server/rateLimit.d.ts +40 -0
- package/dist/types/server/safeFetch.d.ts +137 -0
- package/dist/types/server/securityHeaders.d.ts +221 -0
- package/dist/types/server/userInvalidation.d.ts +114 -0
- package/dist/types/server/verifySecret.d.ts +29 -0
- package/dist/types/session/SessionClient.d.ts +418 -0
- package/dist/types/session/accountDelegationAccess.d.ts +40 -0
- package/dist/types/session/accountDialogController.d.ts +648 -0
- package/dist/types/session/accountSwitchTargets.d.ts +70 -0
- package/dist/types/session/authStateStore.d.ts +153 -0
- package/dist/types/session/createSessionClient.d.ts +30 -0
- package/dist/types/session/deviceDirectory.d.ts +182 -0
- package/dist/types/session/deviceSwitcherRows.d.ts +92 -0
- package/dist/types/session/identityPin.d.ts +87 -0
- package/dist/types/session/identitySession.d.ts +105 -0
- package/dist/types/session/projectSessionState.d.ts +74 -0
- package/dist/types/session/refresh.d.ts +179 -0
- package/dist/types/session/sessionClientHost.d.ts +18 -0
- package/dist/types/session/sharedDeviceCredential.d.ts +202 -0
- package/dist/types/session/socketLoader.d.ts +11 -0
- package/dist/types/shared/utils/colorUtils.d.ts +104 -0
- package/dist/types/shared/utils/errorUtils.d.ts +97 -0
- package/dist/types/shared/utils/index.d.ts +13 -0
- package/dist/types/shared/utils/networkUtils.d.ts +139 -0
- package/dist/types/shared/utils/themeUtils.d.ts +90 -0
- package/dist/types/utils/accountCacheSweep.d.ts +75 -0
- package/dist/types/utils/accountUtils.d.ts +100 -0
- package/dist/types/utils/activityId.d.ts +2 -0
- package/dist/types/utils/apiUtils.d.ts +95 -0
- package/dist/types/utils/asyncUtils.d.ts +62 -0
- package/dist/types/utils/authHelpers.d.ts +58 -0
- package/dist/types/utils/authWebUrl.d.ts +16 -0
- package/dist/types/utils/avatarUtils.d.ts +16 -0
- package/dist/types/utils/cache.d.ts +130 -0
- package/dist/types/utils/cacheKey.d.ts +66 -0
- package/dist/types/utils/coldBoot.d.ts +131 -0
- package/dist/types/utils/commonsApproval.d.ts +13 -0
- package/dist/types/utils/commonsDelivery.d.ts +105 -0
- package/dist/types/utils/deviceManager.d.ts +65 -0
- package/dist/types/utils/displayNamePolicyRanges.generated.d.ts +57 -0
- package/dist/types/utils/edgeRegion.d.ts +2 -0
- package/dist/types/utils/errorUtils.d.ts +125 -0
- package/dist/types/utils/identityCacheSweep.d.ts +80 -0
- package/dist/types/utils/languageUtils.d.ts +100 -0
- package/dist/types/utils/oauthPkce.d.ts +157 -0
- package/dist/types/utils/officialOrigins.d.ts +13 -0
- package/dist/types/utils/oxyServiceEnvironment.d.ts +17 -0
- package/dist/types/utils/platform.d.ts +49 -0
- package/dist/types/utils/profileLinks.d.ts +44 -0
- package/dist/types/utils/redactUrl.d.ts +17 -0
- package/dist/types/utils/registrableApex.d.ts +27 -0
- package/dist/types/utils/requestUtils.d.ts +123 -0
- package/dist/types/utils/sessionUtils.d.ts +54 -0
- package/dist/types/utils/textNormalization.d.ts +103 -0
- package/dist/types/utils/userHandle.d.ts +26 -0
- package/dist/types/utils/userIdentity.d.ts +21 -0
- package/dist/types/utils/validationUtils.d.ts +268 -0
- package/dist/types/utils/webauthnOrigin.d.ts +32 -0
- package/package.json +168 -0
- package/src/HttpService.ts +1553 -0
- package/src/OxyServices.base.ts +478 -0
- package/src/OxyServices.errors.ts +122 -0
- package/src/OxyServices.ts +172 -0
- package/src/__tests__/authSocket.test.ts +96 -0
- package/src/__tests__/httpServiceActivityId.test.ts +49 -0
- package/src/__tests__/httpServiceAuthSelfAwait.test.ts +108 -0
- package/src/__tests__/httpServiceCache.test.ts +318 -0
- package/src/__tests__/httpServiceCsrf.test.ts +235 -0
- package/src/__tests__/httpServiceFormEncoded.test.ts +142 -0
- package/src/__tests__/httpServiceQueueDeadlock.test.ts +128 -0
- package/src/__tests__/httpServiceUnwrapEnvelope.test.ts +115 -0
- package/src/__tests__/inSessionRefresh.test.ts +260 -0
- package/src/__tests__/linkedClient.test.ts +370 -0
- package/src/__tests__/parseHttpErrorBody.test.ts +116 -0
- package/src/__tests__/serverValueImportsDeclared.test.ts +120 -0
- package/src/__tests__/userIdentity.test.ts +143 -0
- package/src/boot/__tests__/sessionColdBoot.identity.test.ts +393 -0
- package/src/boot/__tests__/sessionColdBoot.sharedDevice.test.ts +325 -0
- package/src/boot/__tests__/sessionColdBoot.test.ts +570 -0
- package/src/boot/sessionColdBoot.ts +529 -0
- package/src/constants/version.ts +15 -0
- package/src/crypto/__tests__/backupMaterial.test.ts +86 -0
- package/src/crypto/__tests__/cryptoPrimitives.test.ts +226 -0
- package/src/crypto/__tests__/identityMocks.ts +125 -0
- package/src/crypto/__tests__/keyManager.atomicity.test.ts +272 -0
- package/src/crypto/__tests__/keyManager.cacheSafety.test.ts +175 -0
- package/src/crypto/__tests__/keyManager.identityStatus.test.ts +217 -0
- package/src/crypto/__tests__/keyManager.recoveryLadder.test.ts +179 -0
- package/src/crypto/__tests__/keyManager.recoveryMnemonic.test.ts +138 -0
- package/src/crypto/__tests__/keyManager.storageMigration.test.ts +227 -0
- package/src/crypto/__tests__/keyManager.test.ts +329 -0
- package/src/crypto/__tests__/polyfill.test.ts +109 -0
- package/src/crypto/__tests__/recoveryPhrase.test.ts +61 -0
- package/src/crypto/__tests__/scopedSeed.test.ts +126 -0
- package/src/crypto/__tests__/signChallengeShared.test.ts +63 -0
- package/src/crypto/__tests__/signedRecord.test.ts +230 -0
- package/src/crypto/aead.ts +97 -0
- package/src/crypto/ecdh.ts +37 -0
- package/src/crypto/identityMarker.ts +291 -0
- package/src/crypto/kdf.ts +43 -0
- package/src/crypto/keyManager.ts +2607 -0
- package/src/crypto/polyfill.ts +143 -0
- package/src/crypto/recoveryPhrase.ts +337 -0
- package/src/crypto/signatureService.ts +350 -0
- package/src/i18n/__tests__/accountCategoryLabels.test.ts +62 -0
- package/src/i18n/__tests__/accountRoleLabels.test.ts +54 -0
- package/src/i18n/__tests__/reputationCategoryLabels.test.ts +56 -0
- package/src/i18n/__tests__/trustTierLabels.test.ts +47 -0
- package/src/i18n/accountCategoryLabels.ts +44 -0
- package/src/i18n/accountRoleLabels.ts +26 -0
- package/src/i18n/index.ts +88 -0
- package/src/i18n/locales/ar-SA.json +282 -0
- package/src/i18n/locales/ca-ES.json +282 -0
- package/src/i18n/locales/de-DE.json +282 -0
- package/src/i18n/locales/en-US.json +2161 -0
- package/src/i18n/locales/es-ES.json +2161 -0
- package/src/i18n/locales/fr-FR.json +282 -0
- package/src/i18n/locales/it-IT.json +282 -0
- package/src/i18n/locales/ja-JP.json +282 -0
- package/src/i18n/locales/ko-KR.json +282 -0
- package/src/i18n/locales/pt-PT.json +282 -0
- package/src/i18n/locales/zh-CN.json +282 -0
- package/src/i18n/reputationCategoryLabels.ts +20 -0
- package/src/i18n/trustTierLabels.ts +18 -0
- package/src/index.ts +881 -0
- package/src/inference/OxyInferenceClient.ts +888 -0
- package/src/inference/__tests__/OxyInferenceClient.test.ts +834 -0
- package/src/logger/__tests__/logger.test.ts +207 -0
- package/src/logger/index.ts +217 -0
- package/src/mixins/OxyServices.accounts.ts +1330 -0
- package/src/mixins/OxyServices.analytics.ts +53 -0
- package/src/mixins/OxyServices.appData.ts +158 -0
- package/src/mixins/OxyServices.assets.ts +861 -0
- package/src/mixins/OxyServices.auth.ts +1858 -0
- package/src/mixins/OxyServices.chains.ts +134 -0
- package/src/mixins/OxyServices.civic.ts +945 -0
- package/src/mixins/OxyServices.connectedApps.ts +174 -0
- package/src/mixins/OxyServices.contacts.ts +73 -0
- package/src/mixins/OxyServices.deviceBoot.ts +210 -0
- package/src/mixins/OxyServices.deviceTransfer.ts +393 -0
- package/src/mixins/OxyServices.devices.ts +120 -0
- package/src/mixins/OxyServices.features.ts +454 -0
- package/src/mixins/OxyServices.followGraph.ts +293 -0
- package/src/mixins/OxyServices.identity.ts +705 -0
- package/src/mixins/OxyServices.identityBackup.ts +250 -0
- package/src/mixins/OxyServices.inference.ts +57 -0
- package/src/mixins/OxyServices.language.ts +144 -0
- package/src/mixins/OxyServices.links.ts +107 -0
- package/src/mixins/OxyServices.location.ts +46 -0
- package/src/mixins/OxyServices.nodes.ts +337 -0
- package/src/mixins/OxyServices.notifications.ts +142 -0
- package/src/mixins/OxyServices.payment.ts +163 -0
- package/src/mixins/OxyServices.privacy.ts +219 -0
- package/src/mixins/OxyServices.reputation.ts +436 -0
- package/src/mixins/OxyServices.security.ts +110 -0
- package/src/mixins/OxyServices.store.ts +585 -0
- package/src/mixins/OxyServices.topics.ts +169 -0
- package/src/mixins/OxyServices.user.ts +1137 -0
- package/src/mixins/OxyServices.utility.ts +1370 -0
- package/src/mixins/__tests__/OxyServices.civic.test.ts +1095 -0
- package/src/mixins/__tests__/OxyServices.deviceBoot.test.ts +124 -0
- package/src/mixins/__tests__/OxyServices.deviceTransfer.test.ts +271 -0
- package/src/mixins/__tests__/OxyServices.identity.test.ts +376 -0
- package/src/mixins/__tests__/OxyServices.links.test.ts +154 -0
- package/src/mixins/__tests__/OxyServices.nodes.test.ts +341 -0
- package/src/mixins/__tests__/OxyServices.rotateKey.test.ts +276 -0
- package/src/mixins/__tests__/OxyServices.serviceAssetMetadata.test.ts +192 -0
- package/src/mixins/__tests__/OxyServices.serviceAssetMetadataBySha.test.ts +135 -0
- package/src/mixins/__tests__/accounts.test.ts +727 -0
- package/src/mixins/__tests__/appData.test.ts +203 -0
- package/src/mixins/__tests__/assetCredentials.test.ts +47 -0
- package/src/mixins/__tests__/assetUpload.test.ts +191 -0
- package/src/mixins/__tests__/backgroundCredential.httpIntegration.test.ts +135 -0
- package/src/mixins/__tests__/chains.test.ts +113 -0
- package/src/mixins/__tests__/commonsSignIn.test.ts +1144 -0
- package/src/mixins/__tests__/connectedApps.test.ts +123 -0
- package/src/mixins/__tests__/deviceTokenMintPinned.test.ts +113 -0
- package/src/mixins/__tests__/discoveryErrorHandling.test.ts +266 -0
- package/src/mixins/__tests__/followCacheInvalidation.test.ts +173 -0
- package/src/mixins/__tests__/followGraph.test.ts +147 -0
- package/src/mixins/__tests__/followGraphPagination.test.ts +271 -0
- package/src/mixins/__tests__/getFileDownloadUrl.test.ts +346 -0
- package/src/mixins/__tests__/getFollowStatuses.test.ts +95 -0
- package/src/mixins/__tests__/getUsersByIds.test.ts +149 -0
- package/src/mixins/__tests__/identityBackup.test.ts +315 -0
- package/src/mixins/__tests__/identityWriteCacheInvalidation.test.ts +407 -0
- package/src/mixins/__tests__/inferenceFactory.test.ts +58 -0
- package/src/mixins/__tests__/onTokensChanged.test.ts +129 -0
- package/src/mixins/__tests__/preSessionSkipAuth.test.ts +284 -0
- package/src/mixins/__tests__/privacyCacheInvalidation.test.ts +155 -0
- package/src/mixins/__tests__/reputation.test.ts +522 -0
- package/src/mixins/__tests__/serviceAuth.test.ts +832 -0
- package/src/mixins/__tests__/serviceTokenJwks.test.ts +208 -0
- package/src/mixins/__tests__/store.test.ts +304 -0
- package/src/mixins/__tests__/topics.test.ts +156 -0
- package/src/mixins/__tests__/userReadCacheBypass.test.ts +129 -0
- package/src/mixins/__tests__/userTokenAuth.test.ts +746 -0
- package/src/mixins/__tests__/verifyChallenge.test.ts +130 -0
- package/src/mixins/__tests__/verifyServiceActingAs.test.ts +167 -0
- package/src/mixins/__tests__/webauthnAuth.test.ts +205 -0
- package/src/mixins/index.ts +201 -0
- package/src/mixins/mixinHelpers.ts +69 -0
- package/src/models/Topic.ts +46 -0
- package/src/models/interfaces.ts +786 -0
- package/src/models/session.ts +55 -0
- package/src/server/__tests__/auth.test.ts +78 -0
- package/src/server/__tests__/capabilityTicket.test.ts +111 -0
- package/src/server/__tests__/cors.socket.test.ts +225 -0
- package/src/server/__tests__/cors.test.ts +158 -0
- package/src/server/__tests__/rateLimit.test.ts +257 -0
- package/src/server/__tests__/safeFetch.test.ts +232 -0
- package/src/server/__tests__/securityHeaders.test.ts +348 -0
- package/src/server/__tests__/serviceTokenAttribution.test.ts +396 -0
- package/src/server/__tests__/userInvalidation.test.ts +203 -0
- package/src/server/__tests__/verifySecret.test.ts +40 -0
- package/src/server/auth.ts +271 -0
- package/src/server/capabilityTicket.ts +258 -0
- package/src/server/cors.ts +277 -0
- package/src/server/index.ts +136 -0
- package/src/server/rateLimit.ts +313 -0
- package/src/server/safeFetch.ts +586 -0
- package/src/server/securityHeaders.ts +467 -0
- package/src/server/userInvalidation.ts +199 -0
- package/src/server/verifySecret.ts +52 -0
- package/src/session/SessionClient.ts +1001 -0
- package/src/session/__tests__/SessionClient.additive.test.ts +153 -0
- package/src/session/__tests__/SessionClient.broadcastChannel.test.ts +114 -0
- package/src/session/__tests__/SessionClient.diagnostics.test.ts +91 -0
- package/src/session/__tests__/SessionClient.directory.test.ts +688 -0
- package/src/session/__tests__/SessionClient.httpIntegration.test.ts +65 -0
- package/src/session/__tests__/SessionClient.identityPin.test.ts +175 -0
- package/src/session/__tests__/SessionClient.rest.test.ts +119 -0
- package/src/session/__tests__/SessionClient.serverEvents.test.ts +72 -0
- package/src/session/__tests__/SessionClient.socket.test.ts +202 -0
- package/src/session/__tests__/SessionClient.socketFactory.test.ts +81 -0
- package/src/session/__tests__/SessionClient.state.test.ts +78 -0
- package/src/session/__tests__/SessionClient.switchTokenOrder.test.ts +170 -0
- package/src/session/__tests__/accountDelegationAccess.test.ts +104 -0
- package/src/session/__tests__/accountDialogController.test.ts +1969 -0
- package/src/session/__tests__/accountDialogShape.test.ts +118 -0
- package/src/session/__tests__/accountSwitchTargets.test.ts +137 -0
- package/src/session/__tests__/authStateStore.test.ts +451 -0
- package/src/session/__tests__/deviceDirectory.test.ts +422 -0
- package/src/session/__tests__/deviceSwitcherRows.test.ts +223 -0
- package/src/session/__tests__/identityPin.test.ts +131 -0
- package/src/session/__tests__/identitySession.test.ts +194 -0
- package/src/session/__tests__/projectSessionState.test.ts +105 -0
- package/src/session/__tests__/refresh.identityPin.test.ts +307 -0
- package/src/session/__tests__/refresh.test.ts +443 -0
- package/src/session/__tests__/sessionIntegration.test.ts +209 -0
- package/src/session/__tests__/sharedDeviceCredential.test.ts +300 -0
- package/src/session/accountDelegationAccess.ts +72 -0
- package/src/session/accountDialogController.ts +1494 -0
- package/src/session/accountSwitchTargets.ts +93 -0
- package/src/session/authStateStore.ts +502 -0
- package/src/session/createSessionClient.ts +39 -0
- package/src/session/deviceDirectory.ts +269 -0
- package/src/session/deviceSwitcherRows.ts +145 -0
- package/src/session/identityPin.ts +310 -0
- package/src/session/identitySession.ts +206 -0
- package/src/session/projectSessionState.ts +137 -0
- package/src/session/refresh.ts +517 -0
- package/src/session/sessionClientHost.ts +39 -0
- package/src/session/sharedDeviceCredential.ts +349 -0
- package/src/session/socketLoader.ts +30 -0
- package/src/shared/utils/colorUtils.ts +155 -0
- package/src/shared/utils/errorUtils.ts +181 -0
- package/src/shared/utils/index.ts +59 -0
- package/src/shared/utils/networkUtils.ts +248 -0
- package/src/shared/utils/themeUtils.ts +115 -0
- package/src/types/buffer.d.ts +97 -0
- package/src/types/expo-crypto.d.ts +16 -0
- package/src/types/expo-secure-store.d.ts +17 -0
- package/src/utils/__tests__/accountUtils.test.ts +151 -0
- package/src/utils/__tests__/activityId.test.ts +45 -0
- package/src/utils/__tests__/asyncUtils.test.ts +187 -0
- package/src/utils/__tests__/authWebUrl.test.ts +15 -0
- package/src/utils/__tests__/cacheKey.test.ts +0 -0
- package/src/utils/__tests__/coldBoot.test.ts +496 -0
- package/src/utils/__tests__/commonsApproval.test.ts +60 -0
- package/src/utils/__tests__/identityCacheSweep.test.ts +151 -0
- package/src/utils/__tests__/languageUtils.test.ts +219 -0
- package/src/utils/__tests__/oauthPkce.test.ts +272 -0
- package/src/utils/__tests__/officialOrigins.test.ts +31 -0
- package/src/utils/__tests__/oxyServiceEnvironment.test.ts +7 -0
- package/src/utils/__tests__/profileLinks.test.ts +180 -0
- package/src/utils/__tests__/redactUrl.test.ts +33 -0
- package/src/utils/__tests__/registrableApex.test.ts +62 -0
- package/src/utils/__tests__/textNormalization.test.ts +205 -0
- package/src/utils/__tests__/validationUtils.test.ts +703 -0
- package/src/utils/__tests__/webauthnOrigin.test.ts +83 -0
- package/src/utils/accountCacheSweep.ts +93 -0
- package/src/utils/accountUtils.ts +194 -0
- package/src/utils/activityId.ts +2 -0
- package/src/utils/apiUtils.ts +137 -0
- package/src/utils/asyncUtils.ts +280 -0
- package/src/utils/authHelpers.ts +148 -0
- package/src/utils/authWebUrl.ts +17 -0
- package/src/utils/avatarUtils.ts +39 -0
- package/src/utils/cache.ts +273 -0
- package/src/utils/cacheKey.ts +93 -0
- package/src/utils/coldBoot.ts +218 -0
- package/src/utils/commonsApproval.ts +39 -0
- package/src/utils/commonsDelivery.ts +132 -0
- package/src/utils/deviceManager.ts +203 -0
- package/src/utils/displayNamePolicyRanges.generated.ts +69 -0
- package/src/utils/edgeRegion.ts +2 -0
- package/src/utils/errorUtils.ts +352 -0
- package/src/utils/identityCacheSweep.ts +104 -0
- package/src/utils/languageUtils.ts +256 -0
- package/src/utils/oauthPkce.ts +392 -0
- package/src/utils/officialOrigins.ts +62 -0
- package/src/utils/oxyServiceEnvironment.ts +17 -0
- package/src/utils/platform.ts +139 -0
- package/src/utils/profileLinks.ts +91 -0
- package/src/utils/redactUrl.ts +28 -0
- package/src/utils/registrableApex.ts +41 -0
- package/src/utils/requestUtils.ts +237 -0
- package/src/utils/sessionUtils.ts +206 -0
- package/src/utils/textNormalization.ts +162 -0
- package/src/utils/userHandle.ts +49 -0
- package/src/utils/userIdentity.ts +60 -0
- package/src/utils/validationUtils.ts +390 -0
- package/src/utils/webauthnOrigin.ts +52 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { UserNameResponse } from '@oxy.so/contracts';
|
|
2
|
+
export interface ClientSession {
|
|
3
|
+
sessionId: string;
|
|
4
|
+
deviceId: string;
|
|
5
|
+
expiresAt: string;
|
|
6
|
+
lastActive: string;
|
|
7
|
+
userId?: string;
|
|
8
|
+
isCurrent?: boolean;
|
|
9
|
+
/**
|
|
10
|
+
* The account's ordinal slot (0..N) within the device's account set
|
|
11
|
+
* (`SessionAccount.authuser` in `@oxy.so/contracts`), projected from the
|
|
12
|
+
* device-first `DeviceSessionState` — used purely for stable Google-style
|
|
13
|
+
* account-chooser ordering, not for any token-refresh mechanism.
|
|
14
|
+
*/
|
|
15
|
+
authuser?: number;
|
|
16
|
+
/**
|
|
17
|
+
* The HUMAN operating this account, when it is a delegated session — the
|
|
18
|
+
* audit actor behind "The Oxy Collective". Absent when the session belongs to
|
|
19
|
+
* the account itself.
|
|
20
|
+
*
|
|
21
|
+
* The flat wire shape has carried it since the multi-account model shipped and
|
|
22
|
+
* nothing read it, so an operated org rendered exactly like a directly
|
|
23
|
+
* signed-in one. `SessionClient.getActiveContext()` is the richer answer
|
|
24
|
+
* (ADR 0002); this is the same fact on the compatibility lane.
|
|
25
|
+
*/
|
|
26
|
+
operatedByUserId?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface StorageKeys {
|
|
29
|
+
sessions: string;
|
|
30
|
+
activeSessionId: string;
|
|
31
|
+
}
|
|
32
|
+
export interface MinimalUserData {
|
|
33
|
+
id: string;
|
|
34
|
+
username: string;
|
|
35
|
+
name: UserNameResponse;
|
|
36
|
+
avatar?: string;
|
|
37
|
+
}
|
|
38
|
+
export interface SessionLoginResponse {
|
|
39
|
+
sessionId: string;
|
|
40
|
+
deviceId: string;
|
|
41
|
+
expiresAt: string;
|
|
42
|
+
user: MinimalUserData;
|
|
43
|
+
/** JWT access token for API authentication */
|
|
44
|
+
accessToken?: string;
|
|
45
|
+
/**
|
|
46
|
+
* Rotating zero-cookie device credential minted on sign-in / claim. Persisted
|
|
47
|
+
* first-party alongside `deviceId` so cold boot can re-mint via
|
|
48
|
+
* `POST /session/device/token`.
|
|
49
|
+
*/
|
|
50
|
+
deviceSecret?: string;
|
|
51
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import type { NextFunction, Request, RequestHandler, Response } from 'express';
|
|
2
|
+
import type { OxyServices } from '../OxyServices';
|
|
3
|
+
import { OXY_SERVICE_ENVIRONMENTS, type OxyServiceEnvironment } from '../utils/oxyServiceEnvironment';
|
|
4
|
+
export { OXY_SERVICE_ENVIRONMENTS };
|
|
5
|
+
export type { OxyServiceEnvironment };
|
|
6
|
+
export interface OxyRequestUser {
|
|
7
|
+
id: string;
|
|
8
|
+
_id?: string;
|
|
9
|
+
username?: string;
|
|
10
|
+
email?: string;
|
|
11
|
+
avatar?: string;
|
|
12
|
+
[key: string]: unknown;
|
|
13
|
+
}
|
|
14
|
+
export interface OxyServiceAppContext {
|
|
15
|
+
appId: string;
|
|
16
|
+
appName: string;
|
|
17
|
+
scopes: string[];
|
|
18
|
+
credentialId: string;
|
|
19
|
+
/**
|
|
20
|
+
* The Oxy account that owns `appId` and is financially responsible for it.
|
|
21
|
+
* Read off the VERIFIED service-token claim set — never a user id, and never
|
|
22
|
+
* the delegated `X-Oxy-User-Id` (ADR 0007).
|
|
23
|
+
*/
|
|
24
|
+
ownerAccountId: string;
|
|
25
|
+
environment: OxyServiceEnvironment;
|
|
26
|
+
}
|
|
27
|
+
export interface OxyServiceActingAsContext {
|
|
28
|
+
userId: string;
|
|
29
|
+
scopes: string[];
|
|
30
|
+
}
|
|
31
|
+
export interface OxyAuthRequest extends Request {
|
|
32
|
+
userId?: string | null;
|
|
33
|
+
user?: OxyRequestUser | null;
|
|
34
|
+
accessToken?: string;
|
|
35
|
+
sessionId?: string | null;
|
|
36
|
+
serviceApp?: OxyServiceAppContext;
|
|
37
|
+
serviceActingAs?: OxyServiceActingAsContext;
|
|
38
|
+
}
|
|
39
|
+
export interface OxyAuthenticatedRequest extends OxyAuthRequest {
|
|
40
|
+
userId: string;
|
|
41
|
+
user: OxyRequestUser;
|
|
42
|
+
}
|
|
43
|
+
export interface OxyAuthMiddlewareOptions {
|
|
44
|
+
/**
|
|
45
|
+
* Options forwarded to `oxy.auth()`.
|
|
46
|
+
* `optional` is forced to `true` by the composed helpers so route guards can
|
|
47
|
+
* produce one consistent 401 shape.
|
|
48
|
+
*/
|
|
49
|
+
auth?: Parameters<OxyServices['auth']>[0];
|
|
50
|
+
}
|
|
51
|
+
export declare function getOxyUserId(req: Request): string | null;
|
|
52
|
+
export declare function isOxyAuthenticated(req: Request): req is OxyAuthenticatedRequest;
|
|
53
|
+
/**
|
|
54
|
+
* The principal a request is CHARGED to, and the identifiers a receipt needs.
|
|
55
|
+
*
|
|
56
|
+
* Every field is read from the verified service-token claim set. It is an
|
|
57
|
+
* OBJECT, not a string, and that is the point: `getOxyUserId` returns a
|
|
58
|
+
* `string | null`, so a delegated end-user id cannot be passed anywhere an
|
|
59
|
+
* `OxyBillingPrincipal` is expected. The confusion ADR 0007 forbids —
|
|
60
|
+
* attributing spend to the person a service is acting for rather than to the
|
|
61
|
+
* service's own account — stops being a code-review question and becomes a
|
|
62
|
+
* compile error.
|
|
63
|
+
*
|
|
64
|
+
* `scopes` are the effective scopes minted into the token (credential ∩
|
|
65
|
+
* application). Nothing re-intersects them here.
|
|
66
|
+
*/
|
|
67
|
+
export interface OxyBillingPrincipal {
|
|
68
|
+
/** `applications.owner_account_id` — the financially responsible account. */
|
|
69
|
+
readonly accountId: string;
|
|
70
|
+
readonly applicationId: string;
|
|
71
|
+
readonly credentialId: string;
|
|
72
|
+
readonly environment: OxyServiceEnvironment;
|
|
73
|
+
readonly scopes: readonly string[];
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* The full canonical attribution of ADR 0007 for a request: the billing
|
|
77
|
+
* principal PLUS the optional delegated end user.
|
|
78
|
+
*
|
|
79
|
+
* `delegatedUserId` is named for what it is. It answers "on whose behalf" and
|
|
80
|
+
* is absent for a machine credential acting for itself — its absence is normal,
|
|
81
|
+
* and nothing may synthesize one. If removing it would change what any account
|
|
82
|
+
* is charged, the code reading it is wrong.
|
|
83
|
+
*/
|
|
84
|
+
export interface OxyRequestAttribution extends OxyBillingPrincipal {
|
|
85
|
+
readonly delegatedUserId: string | null;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* The billing principal of a request, or `null` when the request carries no
|
|
89
|
+
* verified service principal (an ordinary user session is not a billable
|
|
90
|
+
* machine principal — its account is resolved from the account graph, not from
|
|
91
|
+
* a token claim).
|
|
92
|
+
*
|
|
93
|
+
* Reads `req.serviceApp` and NOTHING else: not `req.userId`, not `req.user`,
|
|
94
|
+
* not `req.serviceActingAs`. That exclusivity is the invariant this function
|
|
95
|
+
* exists to hold, and `serviceTokenAttribution.test.ts` mutation-tests it.
|
|
96
|
+
*
|
|
97
|
+
* **It answers for the SERVICE-TOKEN lane only.** The API's machine-credential
|
|
98
|
+
* lane (`oxy_sk_*`, issue #972 §2.3) resolves the same five facts into its own
|
|
99
|
+
* `req.machineCredential`, deliberately never `req.serviceApp` — populating the
|
|
100
|
+
* latter would hand a self-serve third-party credential the lane that only
|
|
101
|
+
* platform-trusted applications may enter. So a machine-credential request has
|
|
102
|
+
* no billing principal HERE and resolves `null`, which fails closed: the caller
|
|
103
|
+
* must handle it, and `getRequiredOxyBillingPrincipal` throws rather than
|
|
104
|
+
* charging anyone. One accessor answering for both lanes belongs to the public
|
|
105
|
+
* inference edge that has to admit both, and it needs the machine principal's
|
|
106
|
+
* shape to move into this package first.
|
|
107
|
+
*/
|
|
108
|
+
export declare function getOxyBillingPrincipal(req: Request): OxyBillingPrincipal | null;
|
|
109
|
+
/**
|
|
110
|
+
* {@link getOxyBillingPrincipal}, throwing when the request has none. Use on
|
|
111
|
+
* routes that have already required a service token.
|
|
112
|
+
*/
|
|
113
|
+
export declare function getRequiredOxyBillingPrincipal(req: Request): OxyBillingPrincipal;
|
|
114
|
+
/**
|
|
115
|
+
* The delegated end user of a service request, or `null`.
|
|
116
|
+
*
|
|
117
|
+
* Deliberately reads `req.serviceActingAs` — the grant-verified delegation —
|
|
118
|
+
* and not `req.userId`, which on a non-service request is the caller's own
|
|
119
|
+
* session identity and is not a delegation at all.
|
|
120
|
+
*/
|
|
121
|
+
export declare function getOxyDelegatedUserId(req: Request): string | null;
|
|
122
|
+
/**
|
|
123
|
+
* The whole attribution tuple for a service request: who pays, which
|
|
124
|
+
* application and credential, and optionally on whose behalf.
|
|
125
|
+
*/
|
|
126
|
+
export declare function getOxyRequestAttribution(req: Request): OxyRequestAttribution | null;
|
|
127
|
+
export declare function getRequiredOxyUserId(req: Request): string;
|
|
128
|
+
export declare function requireOxyAuth(req: Request, res: Response, next: NextFunction): void;
|
|
129
|
+
export declare function createOptionalOxyAuth(oxy: OxyServices, options?: OxyAuthMiddlewareOptions): RequestHandler;
|
|
130
|
+
export declare function createOxyAuthMiddleware(oxy: OxyServices, options?: OxyAuthMiddlewareOptions): RequestHandler;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { type KeyObject } from 'node:crypto';
|
|
2
|
+
import { type CapabilityTicketClaims, type GrantLimit, type PolicyDecision } from '@oxy.so/contracts';
|
|
3
|
+
import type { Request, RequestHandler } from 'express';
|
|
4
|
+
type UnsignedCapabilityTicketClaims = Omit<CapabilityTicketClaims, 'iss' | 'iat' | 'exp' | 'jti'>;
|
|
5
|
+
export interface CapabilityTicketSigningOptions {
|
|
6
|
+
privateKey: KeyObject;
|
|
7
|
+
keyId: string;
|
|
8
|
+
issuer: string;
|
|
9
|
+
ttlSeconds?: number;
|
|
10
|
+
now?: Date;
|
|
11
|
+
jti?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface CapabilityTicketVerificationOptions {
|
|
14
|
+
resolvePublicKey: (keyId: string) => KeyObject | undefined;
|
|
15
|
+
audience: string;
|
|
16
|
+
issuer?: string;
|
|
17
|
+
now?: Date;
|
|
18
|
+
maximumTtlSeconds?: number;
|
|
19
|
+
}
|
|
20
|
+
export interface CapabilityTicketRequest extends Request {
|
|
21
|
+
capabilityTicket?: CapabilityTicketClaims;
|
|
22
|
+
}
|
|
23
|
+
export interface CapabilityTicketMiddlewareOptions extends CapabilityTicketVerificationOptions {
|
|
24
|
+
authorize: (claims: CapabilityTicketClaims) => Promise<PolicyDecision>;
|
|
25
|
+
}
|
|
26
|
+
export declare class CapabilityTicketError extends Error {
|
|
27
|
+
readonly code: 'malformed' | 'invalid_signature' | 'unknown_key' | 'invalid_claims' | 'expired' | 'not_yet_valid' | 'wrong_audience' | 'wrong_issuer' | 'ttl_exceeded';
|
|
28
|
+
constructor(code: 'malformed' | 'invalid_signature' | 'unknown_key' | 'invalid_claims' | 'expired' | 'not_yet_valid' | 'wrong_audience' | 'wrong_issuer' | 'ttl_exceeded', message: string);
|
|
29
|
+
}
|
|
30
|
+
/** Enforces the signed per-action bounds before a domain handler runs. */
|
|
31
|
+
export declare function inputSatisfiesCapabilityLimits(tool: string, input: Record<string, unknown>, limits: readonly GrantLimit[]): boolean;
|
|
32
|
+
export declare function issueCapabilityTicket(claims: UnsignedCapabilityTicketClaims, options: CapabilityTicketSigningOptions): string;
|
|
33
|
+
export declare function verifyCapabilityTicket(token: string, options: CapabilityTicketVerificationOptions): CapabilityTicketClaims;
|
|
34
|
+
export declare function readCapabilityAuthorization(authorization: string | undefined): string | null;
|
|
35
|
+
/**
|
|
36
|
+
* Verifies cryptographic scope first, then asks the authority service for a
|
|
37
|
+
* live decision. This second check is what makes revocation effective between
|
|
38
|
+
* planning and execution.
|
|
39
|
+
*/
|
|
40
|
+
export declare function createCapabilityTicketMiddleware(options: CapabilityTicketMiddlewareOptions): RequestHandler;
|
|
41
|
+
export {};
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strict CORS allowlist for Oxy backends.
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS EXISTS
|
|
5
|
+
* ---------------
|
|
6
|
+
* App backends kept hand-rolling CORS, and the unsafe patterns recurred:
|
|
7
|
+
* - `Access-Control-Allow-Origin: *` together with credentials (which is
|
|
8
|
+
* spec-invalid AND a credential-leak vector), or
|
|
9
|
+
* - a "reflect whatever Origin the request carried" fallback (effectively
|
|
10
|
+
* `*` for credentialed requests — the Allo wildcard-fallback class).
|
|
11
|
+
*
|
|
12
|
+
* `createOxyCors` returns a self-contained Express middleware (no `cors`
|
|
13
|
+
* package dependency) that:
|
|
14
|
+
* - allows the Oxy apex origin family over HTTPS only: the apex plus
|
|
15
|
+
* one-label subdomains such as `auth.oxy.so`, `api.oxy.so`,
|
|
16
|
+
* `accounts.oxy.so`, `console.oxy.so`, and `inbox.oxy.so`,
|
|
17
|
+
* - allows the caller's explicit `appOrigins`,
|
|
18
|
+
* - REFUSES the opaque origin on both sides (see `OPAQUE_ORIGIN`),
|
|
19
|
+
* - DENIES everything else (no reflection, never a wildcard with credentials),
|
|
20
|
+
* - echoes back the EXACT matched origin (so credentialed requests work) and
|
|
21
|
+
* sets `Vary: Origin` for correct caching,
|
|
22
|
+
* - answers CORS preflight (`OPTIONS`) with `204`.
|
|
23
|
+
*
|
|
24
|
+
* Node/Express-only: exported solely from `@oxy.so/core/server`.
|
|
25
|
+
*/
|
|
26
|
+
import type { RequestHandler } from 'express';
|
|
27
|
+
export interface OxyCorsOptions {
|
|
28
|
+
/**
|
|
29
|
+
* Explicit additional allowed origins (exact-origin match, e.g.
|
|
30
|
+
* `https://app.example.com`, `http://localhost:3000`). These are allowed IN
|
|
31
|
+
* ADDITION TO the built-in HTTPS Oxy apex origin family. Each is normalized
|
|
32
|
+
* via `new URL().origin`.
|
|
33
|
+
*
|
|
34
|
+
* An entry that is not a URL, or whose origin is the opaque origin
|
|
35
|
+
* (`exp://…`, `capacitor://…`, `chrome-extension://…`, `file:`, `data:`), is
|
|
36
|
+
* DROPPED with an error log rather than admitted — see `OPAQUE_ORIGIN` for
|
|
37
|
+
* why one such entry would otherwise admit every other one.
|
|
38
|
+
*/
|
|
39
|
+
appOrigins?: string[];
|
|
40
|
+
/**
|
|
41
|
+
* Whether to emit `Access-Control-Allow-Credentials: true`. Default `true`
|
|
42
|
+
* (the Oxy ecosystem uses cookie/bearer credentials). Even when `true`, the
|
|
43
|
+
* helper NEVER emits a wildcard origin — only an exact matched origin.
|
|
44
|
+
*/
|
|
45
|
+
allowCredentials?: boolean;
|
|
46
|
+
/** HTTP methods to allow. Defaults to the full standard set. */
|
|
47
|
+
methods?: string[];
|
|
48
|
+
/** Request headers to allow. Defaults to the common Oxy set. */
|
|
49
|
+
allowedHeaders?: string[];
|
|
50
|
+
/** Response headers to expose to the browser. Defaults to none. */
|
|
51
|
+
exposedHeaders?: string[];
|
|
52
|
+
/** Preflight cache lifetime in seconds. Default 86400 (24h). */
|
|
53
|
+
maxAgeSeconds?: number;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Normalize the configured `appOrigins` into the exact-match set — the
|
|
57
|
+
* CONFIGURE-SIDE half of the opaque-origin guard.
|
|
58
|
+
*
|
|
59
|
+
* An entry that is not a URL, or whose origin is opaque, is dropped and named
|
|
60
|
+
* in an error log. Dropped rather than thrown on because `appOrigins` is
|
|
61
|
+
* deployment configuration — at least one Oxy backend reads it from the
|
|
62
|
+
* environment — and a typo there must cost that one origin its CORS headers,
|
|
63
|
+
* never the whole service its boot. Both failure modes are equally SAFE (the
|
|
64
|
+
* entry is absent from the set either way), so the choice is purely about
|
|
65
|
+
* blast radius, and dropping keeps it to one origin whose requests then fail
|
|
66
|
+
* visibly in the browser.
|
|
67
|
+
*
|
|
68
|
+
* Exported for `__tests__/cors.socket.test.ts` and NOT re-exported from
|
|
69
|
+
* `server/index.ts`, so it is not part of the package's public surface. The
|
|
70
|
+
* two halves of the guard are separately exported because they are separately
|
|
71
|
+
* testable only that way: with this half in place the match-side half is
|
|
72
|
+
* unreachable through `createOxyCors`, so a test driving the public API alone
|
|
73
|
+
* would measure this function twice and the other one never.
|
|
74
|
+
*/
|
|
75
|
+
export declare function normalizeAppOrigins(appOrigins: string[]): Set<string>;
|
|
76
|
+
/**
|
|
77
|
+
* Whether `origin` may be echoed back: it is in the built-in HTTPS Oxy apex
|
|
78
|
+
* family, or it exactly matches one of the configured app origins.
|
|
79
|
+
*
|
|
80
|
+
* The opaque-origin refusal here is the MATCH-SIDE half of the guard, and it
|
|
81
|
+
* is what makes the property hold regardless of how `explicit` was built — a
|
|
82
|
+
* set that somehow contains `"null"` still matches nothing, because no
|
|
83
|
+
* incoming origin ever normalizes past this line. `normalizeAppOrigins` is
|
|
84
|
+
* what stops such a set existing today; this is what stops it mattering.
|
|
85
|
+
*
|
|
86
|
+
* Exported for the same reason as `normalizeAppOrigins`, and likewise absent
|
|
87
|
+
* from `server/index.ts`.
|
|
88
|
+
*/
|
|
89
|
+
export declare function matchesAllowedOrigin(explicit: ReadonlySet<string>, origin: string): boolean;
|
|
90
|
+
/**
|
|
91
|
+
* Create a strict Oxy CORS middleware. See module docs.
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```ts
|
|
95
|
+
* app.use(createOxyCors({ appOrigins: ['https://app.example.com'] }));
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
98
|
+
export declare function createOxyCors(options?: OxyCorsOptions): RequestHandler;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @oxy.so/core/server — Server-only utilities for Oxy backends
|
|
3
|
+
*
|
|
4
|
+
* This subpath export provides Express middleware and Node.js-specific
|
|
5
|
+
* utilities that are not available in React Native or browser environments.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { createOxyRateLimit } from '@oxy.so/core/server';
|
|
10
|
+
* import { oxyClient } from '@oxy.so/core';
|
|
11
|
+
*
|
|
12
|
+
* const oxy = oxyClient({ apiUrl: 'https://api.oxy.so' });
|
|
13
|
+
*
|
|
14
|
+
* app.use(createOxyRateLimit(oxy, { store: redisStore }));
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export { createOptionalOxyAuth, createOxyAuthMiddleware, getOxyBillingPrincipal, getOxyDelegatedUserId, getOxyRequestAttribution, getOxyUserId, getRequiredOxyBillingPrincipal, getRequiredOxyUserId, isOxyAuthenticated, requireOxyAuth, OXY_SERVICE_ENVIRONMENTS, } from './auth';
|
|
18
|
+
export type { OxyAuthenticatedRequest, OxyAuthMiddlewareOptions, OxyAuthRequest, OxyBillingPrincipal, OxyRequestAttribution, OxyRequestUser, OxyServiceActingAsContext, OxyServiceAppContext, OxyServiceEnvironment, } from './auth';
|
|
19
|
+
export { createOxyRateLimit } from './rateLimit';
|
|
20
|
+
export type { OxyRateLimitOptions } from './rateLimit';
|
|
21
|
+
export { assertSafePublicUrl, isBlockedIp, safeFetch, SsrfRejection, UpstreamError, ALLOWED_PORTS, ALLOWED_PROTOCOLS, BLOCKED_HOSTNAMES, DEFAULT_USER_AGENT, MAX_REDIRECTS, MAX_URL_LENGTH, UPSTREAM_HEADERS_TIMEOUT_MS, } from './safeFetch';
|
|
22
|
+
export type { SafeFetchOptions, SafeFetchResult, SsrfCheckFail, SsrfCheckOk, SsrfCheckResult, } from './safeFetch';
|
|
23
|
+
export { createOxyCors } from './cors';
|
|
24
|
+
export type { OxyCorsOptions } from './cors';
|
|
25
|
+
export { buildOxyCspDirectives, buildOxyPagesHeaders, createOxySecurityHeaders, cspSourcesFor, extractInlineScripts, formatOxyCspPolicy, inlineScriptCspHash, OXY_CSP_BASELINE, } from './securityHeaders';
|
|
26
|
+
export type { OxyCspDirective, OxyCspExtensions, OxyPagesHeadersOptions, OxySecurityHeadersOptions, } from './securityHeaders';
|
|
27
|
+
export { CapabilityTicketError, createCapabilityTicketMiddleware, inputSatisfiesCapabilityLimits, issueCapabilityTicket, readCapabilityAuthorization, verifyCapabilityTicket, } from './capabilityTicket';
|
|
28
|
+
export type { CapabilityTicketMiddlewareOptions, CapabilityTicketRequest, CapabilityTicketSigningOptions, CapabilityTicketVerificationOptions, } from './capabilityTicket';
|
|
29
|
+
export { verifySecret } from './verifySecret';
|
|
30
|
+
export { createOxyUserInvalidationHandler, publishOxyUserInvalidation, } from './userInvalidation';
|
|
31
|
+
export type { OxyInvalidationPublisher, OxyUserInvalidationHandlerOptions, } from './userInvalidation';
|
|
32
|
+
export { evictOxyIdentityCache, oxyUserByIdCacheKey, OXY_IDENTITY_CACHE_PREFIXES } from '../utils/identityCacheSweep';
|
|
33
|
+
export type { OxyIdentityCacheEvictor } from '../utils/identityCacheSweep';
|
|
34
|
+
export { registrableApex } from '../utils/registrableApex';
|
|
35
|
+
export { isOfficialWebOrigin } from '../utils/officialOrigins';
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { Request, RequestHandler } from 'express';
|
|
2
|
+
import { type Store } from 'express-rate-limit';
|
|
3
|
+
import type { OxyServices } from '../OxyServices';
|
|
4
|
+
export interface OxyRateLimitOptions {
|
|
5
|
+
/**
|
|
6
|
+
* Max requests per window for AUTHENTICATED users (keyed per user).
|
|
7
|
+
* Default 5000 — ~5.5 req/s sustained, comfortable for a media client that
|
|
8
|
+
* fans out into many small requests per screen.
|
|
9
|
+
*/
|
|
10
|
+
authenticatedMax?: number;
|
|
11
|
+
/**
|
|
12
|
+
* Max requests per window for ANONYMOUS callers (keyed per IP).
|
|
13
|
+
* Default 600 — enough to browse public pages while bounding abuse.
|
|
14
|
+
*/
|
|
15
|
+
anonymousMax?: number;
|
|
16
|
+
/** Rate-limit window in milliseconds. Default 15 minutes. */
|
|
17
|
+
windowMs?: number;
|
|
18
|
+
/**
|
|
19
|
+
* Optional `express-rate-limit` store (e.g. a Redis store) for distributed
|
|
20
|
+
* limiting across instances. Defaults to the library's in-memory store.
|
|
21
|
+
*/
|
|
22
|
+
store?: Store;
|
|
23
|
+
/**
|
|
24
|
+
* Extra path predicates to exempt from limiting, in addition to the built-in
|
|
25
|
+
* exemptions (uploads, image proxy, streaming sub-requests, health probes,
|
|
26
|
+
* CORS preflight). Return `true` to skip limiting for the request.
|
|
27
|
+
*/
|
|
28
|
+
exempt?: (req: Request) => boolean;
|
|
29
|
+
/** Response message body sent with a 429. */
|
|
30
|
+
message?: string;
|
|
31
|
+
/**
|
|
32
|
+
* Options forwarded to the internal `oxy.auth({ optional: true })` resolver
|
|
33
|
+
* (e.g. `{ jwtSecret }` to verify service tokens). `optional` is forced true.
|
|
34
|
+
*/
|
|
35
|
+
auth?: Parameters<OxyServices['auth']>[0];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Build the composed Oxy rate-limit middleware. See module docs for rationale.
|
|
39
|
+
*/
|
|
40
|
+
export declare function createOxyRateLimit(oxy: OxyServices, options?: OxyRateLimitOptions): RequestHandler;
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SSRF-safe upstream HTTP fetch for Oxy backends.
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS EXISTS
|
|
5
|
+
* ---------------
|
|
6
|
+
* Every Oxy backend that contacts a caller-influenced URL — media proxies,
|
|
7
|
+
* the website MCP image upload/debug tools, federated fetches, link
|
|
8
|
+
* unfurlers — needs the exact same Server-Side Request Forgery (SSRF)
|
|
9
|
+
* defence. Apps were re-implementing it (or worse, omitting it), so the
|
|
10
|
+
* gold-standard primitive (originally `packages/backend/src/utils` in
|
|
11
|
+
* Mention) lives here ONCE.
|
|
12
|
+
*
|
|
13
|
+
* THE CONTRACT
|
|
14
|
+
* ------------
|
|
15
|
+
* - Every URL — including each redirect hop — is validated by
|
|
16
|
+
* {@link assertSafePublicUrl}: a real DNS resolution plus a denylist of
|
|
17
|
+
* private/reserved/metadata ranges (10/8, 127/8, 169.254.169.254, ::1, …).
|
|
18
|
+
* - The TCP connection is PINNED to the validated IP via a custom `lookup`,
|
|
19
|
+
* closing the DNS-rebind TOCTOU window — DNS is NOT re-resolved at connect
|
|
20
|
+
* time, so the address we validated is exactly the address Node connects to.
|
|
21
|
+
* - Redirects are followed manually (bounded) so every hop is re-validated and
|
|
22
|
+
* redirect bodies (potentially unbounded) are destroyed, not drained.
|
|
23
|
+
*
|
|
24
|
+
* Node-only: this module imports `node:http`/`node:https`/`node:dns` and is
|
|
25
|
+
* exported solely from `@oxy.so/core/server`. It MUST NOT be reachable from the
|
|
26
|
+
* browser `@oxy.so/core` entry.
|
|
27
|
+
*/
|
|
28
|
+
import { type IncomingMessage, type IncomingHttpHeaders } from 'node:http';
|
|
29
|
+
/** Maximum accepted length of an input URL (DoS guard). */
|
|
30
|
+
export declare const MAX_URL_LENGTH = 2048;
|
|
31
|
+
/** The only network ports a safe fetch is allowed to reach upstream. */
|
|
32
|
+
export declare const ALLOWED_PORTS: ReadonlySet<number>;
|
|
33
|
+
/** Protocols a safe fetch is allowed to contact. */
|
|
34
|
+
export declare const ALLOWED_PROTOCOLS: ReadonlySet<string>;
|
|
35
|
+
/**
|
|
36
|
+
* Time-to-first-byte deadline: how long to wait for the upstream to establish
|
|
37
|
+
* the connection and send its RESPONSE HEADERS before aborting. Enforced via
|
|
38
|
+
* `req.setTimeout` on the `ClientRequest`; once headers arrive, the caller owns
|
|
39
|
+
* the (longer) streaming lifetime of the response body.
|
|
40
|
+
*/
|
|
41
|
+
export declare const UPSTREAM_HEADERS_TIMEOUT_MS = 8000;
|
|
42
|
+
/** Maximum number of HTTP redirects to follow; each hop is re-validated. */
|
|
43
|
+
export declare const MAX_REDIRECTS = 5;
|
|
44
|
+
/** Default User-Agent presented to upstreams when the caller does not set one. */
|
|
45
|
+
export declare const DEFAULT_USER_AGENT = "OxyServices/1.0 (+https://oxy.so)";
|
|
46
|
+
/** Hostnames that must never be resolved or contacted, regardless of DNS. */
|
|
47
|
+
export declare const BLOCKED_HOSTNAMES: ReadonlySet<string>;
|
|
48
|
+
export interface SsrfCheckOk {
|
|
49
|
+
ok: true;
|
|
50
|
+
/** The validated literal IP the caller MUST connect to. */
|
|
51
|
+
ip: string;
|
|
52
|
+
/** IP family of the validated address (4 or 6). */
|
|
53
|
+
family: 4 | 6;
|
|
54
|
+
}
|
|
55
|
+
export interface SsrfCheckFail {
|
|
56
|
+
ok: false;
|
|
57
|
+
/** Human-readable, non-sensitive reason (safe to log; not echoed to clients). */
|
|
58
|
+
reason: string;
|
|
59
|
+
}
|
|
60
|
+
export type SsrfCheckResult = SsrfCheckOk | SsrfCheckFail;
|
|
61
|
+
/**
|
|
62
|
+
* Return true if a literal IP address is private/loopback/link-local/reserved/
|
|
63
|
+
* multicast/metadata and therefore must NOT be contacted.
|
|
64
|
+
*/
|
|
65
|
+
export declare function isBlockedIp(rawIp: string): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Validate that a URL is syntactically a public http(s) URL and that its
|
|
68
|
+
* hostname resolves ONLY to non-blocked, public IP addresses.
|
|
69
|
+
*
|
|
70
|
+
* On success, returns the single validated IP (the first allowed record) that
|
|
71
|
+
* the HTTP client MUST pin its connection to. Every resolved address is checked;
|
|
72
|
+
* if ANY resolves into a blocked range the URL is rejected (an attacker
|
|
73
|
+
* controlling a multi-record DNS response cannot smuggle one internal IP past
|
|
74
|
+
* the check).
|
|
75
|
+
*
|
|
76
|
+
* Re-run this on EVERY redirect hop so a public hostname cannot redirect (or
|
|
77
|
+
* DNS-rebind) into an internal address.
|
|
78
|
+
*/
|
|
79
|
+
export declare function assertSafePublicUrl(rawUrl: string): Promise<SsrfCheckResult>;
|
|
80
|
+
/** Marker error for a blocked SSRF target (map to 403 at the route layer). */
|
|
81
|
+
export declare class SsrfRejection extends Error {
|
|
82
|
+
constructor(reason: string);
|
|
83
|
+
}
|
|
84
|
+
/** Marker error for a generic upstream failure (map to 502 at the route layer). */
|
|
85
|
+
export declare class UpstreamError extends Error {
|
|
86
|
+
constructor(reason: string);
|
|
87
|
+
}
|
|
88
|
+
/** Options for {@link safeFetch}. */
|
|
89
|
+
export interface SafeFetchOptions {
|
|
90
|
+
/** HTTP method. Defaults to `GET`. */
|
|
91
|
+
method?: string;
|
|
92
|
+
/** Extra request headers. A `User-Agent` is added if none is provided. */
|
|
93
|
+
headers?: Record<string, string>;
|
|
94
|
+
/** Request body for POST/PUT/PATCH. */
|
|
95
|
+
body?: string | Buffer;
|
|
96
|
+
/**
|
|
97
|
+
* Maximum number of redirects to follow (each re-validated). Defaults to
|
|
98
|
+
* {@link MAX_REDIRECTS}. Set to `0` to disallow redirects.
|
|
99
|
+
*/
|
|
100
|
+
maxRedirects?: number;
|
|
101
|
+
/**
|
|
102
|
+
* Time-to-first-byte deadline in milliseconds (connect + response headers).
|
|
103
|
+
* Defaults to {@link UPSTREAM_HEADERS_TIMEOUT_MS}.
|
|
104
|
+
*/
|
|
105
|
+
headersTimeoutMs?: number;
|
|
106
|
+
/**
|
|
107
|
+
* Optional external abort signal. When it fires the in-flight request is
|
|
108
|
+
* destroyed.
|
|
109
|
+
*/
|
|
110
|
+
signal?: AbortSignal;
|
|
111
|
+
}
|
|
112
|
+
/** The validated, non-redirect response returned by {@link safeFetch}. */
|
|
113
|
+
export interface SafeFetchResult {
|
|
114
|
+
/**
|
|
115
|
+
* The first non-redirect response. The caller OWNS draining/destroying this
|
|
116
|
+
* stream (stream it to the client, or buffer a bounded prefix, then destroy).
|
|
117
|
+
*/
|
|
118
|
+
response: IncomingMessage;
|
|
119
|
+
/** The HTTP status code of the response. */
|
|
120
|
+
status: number;
|
|
121
|
+
/** Response headers. */
|
|
122
|
+
headers: IncomingHttpHeaders;
|
|
123
|
+
/** The final, post-redirect URL that produced the response. */
|
|
124
|
+
finalUrl: string;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* SSRF-safe HTTP(S) fetch. Validates the URL (and every redirect hop) against
|
|
128
|
+
* the private/metadata-range denylist, pins the connection to the validated IP,
|
|
129
|
+
* follows a bounded number of redirects (destroying redirect bodies), and
|
|
130
|
+
* returns the first non-redirect response.
|
|
131
|
+
*
|
|
132
|
+
* The caller owns the returned response stream — drain or destroy it.
|
|
133
|
+
*
|
|
134
|
+
* @throws {SsrfRejection} when any hop targets a blocked address/host/port.
|
|
135
|
+
* @throws {UpstreamError} on redirect-loop / malformed-redirect / timeout.
|
|
136
|
+
*/
|
|
137
|
+
export declare function safeFetch(rawUrl: string, options?: SafeFetchOptions): Promise<SafeFetchResult>;
|