runline 0.35.0 → 0.36.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/dist/auth/errors.d.ts +3 -3
- package/dist/auth/errors.js +3 -3
- package/dist/credentials/aws-plugin.d.ts +79 -0
- package/dist/credentials/aws-plugin.js +179 -0
- package/dist/credentials/aws.d.ts +41 -0
- package/dist/credentials/aws.js +213 -0
- package/dist/credentials/broker.d.ts +11 -0
- package/dist/{plugins/_shared/credentialAdapter.js → credentials/broker.js} +91 -41
- package/dist/credentials/plugin.d.ts +255 -0
- package/dist/{plugins/_shared/credentials.js → credentials/plugin.js} +11 -10
- package/dist/credentials/policy.d.ts +11 -3
- package/dist/credentials/policy.js +22 -3
- package/dist/credentials/registry.d.ts +14 -0
- package/dist/credentials/registry.js +55 -2
- package/dist/credentials/sigv4.d.ts +47 -0
- package/dist/credentials/sigv4.js +145 -0
- package/dist/credentials/transport.d.ts +9 -0
- package/dist/credentials/transport.js +106 -26
- package/dist/credentials/types.d.ts +63 -4
- package/dist/index.d.ts +8 -2
- package/dist/index.js +5 -1
- package/dist/plugins/_shared/googleAuth.js +3 -5
- package/dist/plugins/_shared/googleCredentials.js +1 -2
- package/dist/plugins/_shared/mediaFile.js +4 -1
- package/dist/plugins/_shared/microsoftAuth.js +3 -5
- package/dist/plugins/_shared/microsoftCredentials.js +1 -2
- package/dist/plugins/_shared/shiftCloud.js +1 -2
- package/dist/plugins/_shared/shiftCredentials.js +1 -2
- package/dist/plugins/actionNetwork/src/credentials.js +1 -1
- package/dist/plugins/actionNetwork/src/index.js +1 -1
- package/dist/plugins/activeCampaign/src/credentials.js +1 -1
- package/dist/plugins/activeCampaign/src/index.js +1 -1
- package/dist/plugins/adalo/src/credentials.js +1 -1
- package/dist/plugins/adalo/src/index.js +1 -1
- package/dist/plugins/affinity/src/credentials.js +1 -1
- package/dist/plugins/affinity/src/index.js +1 -1
- package/dist/plugins/agentMail/src/credentials.js +1 -1
- package/dist/plugins/agentMail/src/shared.js +1 -2
- package/dist/plugins/agileCrm/src/credentials.js +1 -1
- package/dist/plugins/agileCrm/src/index.js +1 -1
- package/dist/plugins/airtable/src/credentials.js +1 -1
- package/dist/plugins/airtable/src/index.js +1 -1
- package/dist/plugins/airtop/src/credentials.js +1 -1
- package/dist/plugins/airtop/src/index.js +1 -1
- package/dist/plugins/apiTemplateIo/src/credentials.js +1 -1
- package/dist/plugins/apiTemplateIo/src/index.js +1 -1
- package/dist/plugins/asana/src/credentials.js +1 -1
- package/dist/plugins/asana/src/index.js +1 -1
- package/dist/plugins/autopilot/src/credentials.js +1 -1
- package/dist/plugins/autopilot/src/index.js +1 -1
- package/dist/plugins/bambooHr/src/credentials.js +1 -1
- package/dist/plugins/bambooHr/src/index.js +1 -1
- package/dist/plugins/bannerbear/src/credentials.js +1 -1
- package/dist/plugins/bannerbear/src/index.js +1 -1
- package/dist/plugins/baserow/src/credentials.js +1 -1
- package/dist/plugins/baserow/src/index.js +1 -1
- package/dist/plugins/beeminder/src/credentials.js +1 -1
- package/dist/plugins/beeminder/src/index.js +1 -1
- package/dist/plugins/bitly/src/credentials.js +1 -1
- package/dist/plugins/bitly/src/index.js +1 -1
- package/dist/plugins/bitwarden/src/credentials.js +1 -1
- package/dist/plugins/bitwarden/src/index.js +1 -1
- package/dist/plugins/box/src/credentials.js +1 -1
- package/dist/plugins/box/src/index.js +1 -1
- package/dist/plugins/brandfetch/src/credentials.js +1 -1
- package/dist/plugins/brandfetch/src/index.js +1 -1
- package/dist/plugins/brevo/src/credentials.js +1 -1
- package/dist/plugins/brevo/src/index.js +1 -1
- package/dist/plugins/bubble/src/credentials.js +1 -1
- package/dist/plugins/bubble/src/index.js +1 -1
- package/dist/plugins/chargebee/src/credentials.js +1 -1
- package/dist/plugins/chargebee/src/index.js +1 -1
- package/dist/plugins/circleci/src/credentials.js +1 -1
- package/dist/plugins/circleci/src/index.js +1 -1
- package/dist/plugins/ciscoWebex/src/credentials.js +1 -1
- package/dist/plugins/ciscoWebex/src/index.js +1 -1
- package/dist/plugins/clearbit/src/credentials.js +1 -1
- package/dist/plugins/clearbit/src/index.js +1 -1
- package/dist/plugins/clickup/src/credentials.js +1 -1
- package/dist/plugins/clickup/src/index.js +1 -1
- package/dist/plugins/clockify/src/credentials.js +1 -1
- package/dist/plugins/clockify/src/index.js +1 -1
- package/dist/plugins/cloudflare/src/credentials.js +1 -1
- package/dist/plugins/cloudflare/src/index.js +1 -1
- package/dist/plugins/cockpit/src/credentials.js +1 -1
- package/dist/plugins/cockpit/src/index.js +1 -1
- package/dist/plugins/coda/src/credentials.js +1 -1
- package/dist/plugins/coda/src/index.js +1 -1
- package/dist/plugins/coingecko/src/credentials.js +1 -1
- package/dist/plugins/coingecko/src/index.js +1 -1
- package/dist/plugins/contentful/src/credentials.js +1 -1
- package/dist/plugins/contentful/src/index.js +1 -1
- package/dist/plugins/convertkit/src/credentials.js +1 -1
- package/dist/plugins/convertkit/src/index.js +1 -1
- package/dist/plugins/copper/src/credentials.js +1 -1
- package/dist/plugins/copper/src/index.js +1 -1
- package/dist/plugins/cortex/src/credentials.js +1 -1
- package/dist/plugins/cortex/src/index.js +1 -1
- package/dist/plugins/currents/src/credentials.js +1 -1
- package/dist/plugins/currents/src/index.js +1 -1
- package/dist/plugins/customerIo/src/credentials.js +1 -1
- package/dist/plugins/customerIo/src/index.js +1 -1
- package/dist/plugins/databricks/src/credentials.js +1 -1
- package/dist/plugins/databricks/src/index.js +1 -1
- package/dist/plugins/deepl/src/credentials.js +1 -1
- package/dist/plugins/deepl/src/index.js +1 -1
- package/dist/plugins/demio/src/credentials.js +1 -1
- package/dist/plugins/demio/src/index.js +1 -1
- package/dist/plugins/dhl/src/credentials.js +1 -1
- package/dist/plugins/dhl/src/index.js +1 -1
- package/dist/plugins/discord/src/credentials.js +1 -1
- package/dist/plugins/discord/src/index.js +1 -1
- package/dist/plugins/discourse/src/credentials.js +1 -1
- package/dist/plugins/discourse/src/index.js +1 -1
- package/dist/plugins/disqus/src/credentials.js +1 -1
- package/dist/plugins/disqus/src/index.js +1 -1
- package/dist/plugins/drift/src/credentials.js +1 -1
- package/dist/plugins/drift/src/index.js +1 -1
- package/dist/plugins/dropbox/src/credentials.js +1 -1
- package/dist/plugins/dropbox/src/index.js +1 -1
- package/dist/plugins/dropcontact/src/credentials.js +1 -1
- package/dist/plugins/dropcontact/src/index.js +1 -1
- package/dist/plugins/egoi/src/credentials.js +1 -1
- package/dist/plugins/egoi/src/index.js +1 -1
- package/dist/plugins/elasticsearch/src/credentials.js +1 -1
- package/dist/plugins/elasticsearch/src/index.js +1 -1
- package/dist/plugins/elevenlabs/src/credentials.js +1 -1
- package/dist/plugins/elevenlabs/src/shared.js +2 -4
- package/dist/plugins/elevenlabs/src/workflows.js +1 -1
- package/dist/plugins/emelia/src/credentials.js +1 -1
- package/dist/plugins/emelia/src/index.js +1 -1
- package/dist/plugins/erpnext/src/credentials.js +1 -1
- package/dist/plugins/erpnext/src/index.js +1 -1
- package/dist/plugins/facebookGraph/src/credentials.js +1 -1
- package/dist/plugins/facebookGraph/src/index.js +1 -2
- package/dist/plugins/fal/src/credentials.js +1 -1
- package/dist/plugins/fal/src/shared.js +1 -1
- package/dist/plugins/freshdesk/src/credentials.js +1 -1
- package/dist/plugins/freshdesk/src/index.js +1 -1
- package/dist/plugins/freshservice/src/credentials.js +1 -1
- package/dist/plugins/freshservice/src/index.js +1 -1
- package/dist/plugins/freshworksCrm/src/credentials.js +1 -1
- package/dist/plugins/freshworksCrm/src/index.js +1 -1
- package/dist/plugins/getresponse/src/credentials.js +1 -1
- package/dist/plugins/getresponse/src/index.js +1 -1
- package/dist/plugins/gett/src/credentials.js +1 -2
- package/dist/plugins/gett/src/index.js +1 -1
- package/dist/plugins/gett/src/login.js +1 -1
- package/dist/plugins/gett/src/session.js +1 -1
- package/dist/plugins/gett/src/shared.js +1 -2
- package/dist/plugins/ghost/src/credentials.js +1 -1
- package/dist/plugins/ghost/src/index.js +1 -1
- package/dist/plugins/github/src/credentials.js +1 -1
- package/dist/plugins/github/src/index.js +1 -1
- package/dist/plugins/gitlab/src/credentials.js +1 -1
- package/dist/plugins/gitlab/src/index.js +1 -1
- package/dist/plugins/gmail/src/index.js +1 -1
- package/dist/plugins/gong/src/credentials.js +1 -1
- package/dist/plugins/gong/src/index.js +1 -1
- package/dist/plugins/googleAppsScript/src/index.js +12 -1
- package/dist/plugins/googleCalendar/src/index.js +1 -1
- package/dist/plugins/googleContacts/src/index.js +1 -1
- package/dist/plugins/googleDocs/src/shared.js +1 -1
- package/dist/plugins/googleDrive/src/index.js +1 -1
- package/dist/plugins/googleImage/src/credentials.js +1 -1
- package/dist/plugins/googleImage/src/index.js +1 -1
- package/dist/plugins/googleSheets/src/index.js +1 -1
- package/dist/plugins/googleSlides/src/index.js +1 -1
- package/dist/plugins/googleTasks/src/index.js +1 -1
- package/dist/plugins/gotify/src/credentials.js +1 -1
- package/dist/plugins/gotify/src/index.js +1 -1
- package/dist/plugins/gotowebinar/src/credentials.js +1 -1
- package/dist/plugins/gotowebinar/src/index.js +1 -1
- package/dist/plugins/grafana/src/credentials.js +1 -1
- package/dist/plugins/grafana/src/index.js +1 -1
- package/dist/plugins/graphql/src/credentials.js +1 -1
- package/dist/plugins/graphql/src/index.js +1 -1
- package/dist/plugins/grist/src/credentials.js +1 -1
- package/dist/plugins/grist/src/index.js +1 -1
- package/dist/plugins/halopsa/src/credentials.js +1 -2
- package/dist/plugins/halopsa/src/index.js +1 -1
- package/dist/plugins/harvest/src/credentials.js +1 -1
- package/dist/plugins/harvest/src/index.js +1 -1
- package/dist/plugins/helpscout/src/credentials.js +1 -1
- package/dist/plugins/helpscout/src/index.js +1 -1
- package/dist/plugins/highlevel/src/credentials.js +1 -1
- package/dist/plugins/highlevel/src/index.js +1 -1
- package/dist/plugins/homeAssistant/src/credentials.js +1 -1
- package/dist/plugins/homeAssistant/src/index.js +1 -1
- package/dist/plugins/hubspot/src/credentials.js +1 -1
- package/dist/plugins/hubspot/src/index.js +1 -1
- package/dist/plugins/humanticAi/src/credentials.js +1 -1
- package/dist/plugins/humanticAi/src/index.js +1 -1
- package/dist/plugins/hunter/src/credentials.js +1 -1
- package/dist/plugins/hunter/src/index.js +1 -1
- package/dist/plugins/intercom/src/credentials.js +1 -1
- package/dist/plugins/intercom/src/index.js +1 -1
- package/dist/plugins/iterable/src/credentials.js +1 -1
- package/dist/plugins/iterable/src/index.js +1 -1
- package/dist/plugins/jenkins/src/credentials.js +1 -1
- package/dist/plugins/jenkins/src/index.js +1 -1
- package/dist/plugins/jira/src/credentials.js +1 -1
- package/dist/plugins/jira/src/index.js +1 -1
- package/dist/plugins/keap/src/credentials.js +1 -1
- package/dist/plugins/keap/src/index.js +1 -1
- package/dist/plugins/kobotoolbox/src/credentials.js +1 -1
- package/dist/plugins/kobotoolbox/src/index.js +1 -1
- package/dist/plugins/lemlist/src/credentials.js +1 -1
- package/dist/plugins/lemlist/src/index.js +1 -1
- package/dist/plugins/linear/src/credentials.js +1 -1
- package/dist/plugins/linear/src/shared.js +1 -1
- package/dist/plugins/lingvanex/src/credentials.js +1 -1
- package/dist/plugins/lingvanex/src/index.js +1 -1
- package/dist/plugins/linkedin/src/credentials.js +1 -1
- package/dist/plugins/linkedin/src/index.js +1 -1
- package/dist/plugins/lonescale/src/credentials.js +1 -1
- package/dist/plugins/lonescale/src/index.js +1 -1
- package/dist/plugins/magento/src/credentials.js +1 -1
- package/dist/plugins/magento/src/index.js +1 -1
- package/dist/plugins/mailcheck/src/credentials.js +1 -1
- package/dist/plugins/mailcheck/src/index.js +1 -1
- package/dist/plugins/mailchimp/src/credentials.js +1 -1
- package/dist/plugins/mailchimp/src/index.js +1 -1
- package/dist/plugins/mailerlite/src/credentials.js +1 -1
- package/dist/plugins/mailerlite/src/index.js +1 -1
- package/dist/plugins/mailgun/src/credentials.js +1 -1
- package/dist/plugins/mailgun/src/index.js +1 -1
- package/dist/plugins/mailjet/src/credentials.js +1 -1
- package/dist/plugins/mailjet/src/index.js +1 -1
- package/dist/plugins/mandrill/src/credentials.js +1 -1
- package/dist/plugins/mandrill/src/index.js +1 -1
- package/dist/plugins/marketstack/src/credentials.js +1 -1
- package/dist/plugins/marketstack/src/index.js +1 -1
- package/dist/plugins/matrix/src/credentials.js +1 -1
- package/dist/plugins/matrix/src/index.js +1 -1
- package/dist/plugins/mattermost/src/credentials.js +1 -1
- package/dist/plugins/mattermost/src/index.js +1 -1
- package/dist/plugins/mautic/src/credentials.js +1 -1
- package/dist/plugins/mautic/src/index.js +1 -1
- package/dist/plugins/medium/src/credentials.js +1 -1
- package/dist/plugins/medium/src/index.js +1 -1
- package/dist/plugins/messagebird/src/credentials.js +1 -1
- package/dist/plugins/messagebird/src/index.js +1 -1
- package/dist/plugins/metabase/src/credentials.js +1 -1
- package/dist/plugins/metabase/src/index.js +1 -1
- package/dist/plugins/microsoftFiles/src/index.js +10 -1
- package/dist/plugins/misp/src/credentials.js +1 -1
- package/dist/plugins/misp/src/index.js +1 -1
- package/dist/plugins/mocean/src/credentials.js +1 -1
- package/dist/plugins/mocean/src/index.js +1 -1
- package/dist/plugins/monday/src/credentials.js +1 -1
- package/dist/plugins/monday/src/index.js +1 -1
- package/dist/plugins/monicaCrm/src/credentials.js +1 -1
- package/dist/plugins/monicaCrm/src/index.js +1 -1
- package/dist/plugins/msg91/src/credentials.js +1 -1
- package/dist/plugins/msg91/src/index.js +1 -1
- package/dist/plugins/nasa/src/credentials.js +1 -1
- package/dist/plugins/nasa/src/index.js +1 -1
- package/dist/plugins/netlify/src/credentials.js +1 -1
- package/dist/plugins/netlify/src/index.js +1 -1
- package/dist/plugins/netscalerAdc/src/credentials.js +1 -1
- package/dist/plugins/netscalerAdc/src/index.js +1 -1
- package/dist/plugins/nextcloud/src/credentials.js +1 -2
- package/dist/plugins/nextcloud/src/index.js +1 -1
- package/dist/plugins/nocodb/src/credentials.js +1 -1
- package/dist/plugins/nocodb/src/index.js +1 -1
- package/dist/plugins/notion/src/credentials.js +1 -1
- package/dist/plugins/notion/src/index.js +1 -1
- package/dist/plugins/npm/src/credentials.js +1 -1
- package/dist/plugins/npm/src/index.js +1 -1
- package/dist/plugins/odoo/src/credentials.js +1 -1
- package/dist/plugins/odoo/src/index.js +1 -2
- package/dist/plugins/okta/src/credentials.js +1 -1
- package/dist/plugins/okta/src/index.js +1 -2
- package/dist/plugins/oneSimpleApi/src/credentials.js +1 -1
- package/dist/plugins/oneSimpleApi/src/index.js +1 -1
- package/dist/plugins/onfleet/src/credentials.js +1 -1
- package/dist/plugins/onfleet/src/index.js +1 -1
- package/dist/plugins/openai/src/credentials.js +1 -1
- package/dist/plugins/openai/src/index.js +1 -1
- package/dist/plugins/openweathermap/src/credentials.js +1 -1
- package/dist/plugins/openweathermap/src/index.js +1 -1
- package/dist/plugins/oura/src/credentials.js +1 -1
- package/dist/plugins/oura/src/index.js +1 -1
- package/dist/plugins/paddle/src/credentials.js +1 -1
- package/dist/plugins/paddle/src/index.js +1 -1
- package/dist/plugins/pagerduty/src/credentials.js +1 -1
- package/dist/plugins/pagerduty/src/index.js +1 -1
- package/dist/plugins/parallel/src/credentials.js +1 -1
- package/dist/plugins/parallel/src/index.js +15 -1
- package/dist/plugins/paypal/src/credentials.js +1 -1
- package/dist/plugins/paypal/src/index.js +1 -1
- package/dist/plugins/peekalink/src/credentials.js +1 -1
- package/dist/plugins/peekalink/src/index.js +1 -1
- package/dist/plugins/phantombuster/src/credentials.js +1 -1
- package/dist/plugins/phantombuster/src/index.js +1 -1
- package/dist/plugins/philipsHue/src/credentials.js +1 -1
- package/dist/plugins/philipsHue/src/index.js +1 -1
- package/dist/plugins/pipedrive/src/credentials.js +1 -1
- package/dist/plugins/pipedrive/src/index.js +1 -1
- package/dist/plugins/plaud/src/shared.js +1 -2
- package/dist/plugins/plivo/src/credentials.js +1 -1
- package/dist/plugins/plivo/src/index.js +1 -1
- package/dist/plugins/posthog/src/credentials.js +1 -1
- package/dist/plugins/posthog/src/index.js +1 -1
- package/dist/plugins/profitwell/src/credentials.js +1 -1
- package/dist/plugins/profitwell/src/index.js +1 -1
- package/dist/plugins/pushbullet/src/credentials.js +1 -1
- package/dist/plugins/pushbullet/src/index.js +1 -1
- package/dist/plugins/pushcut/src/credentials.js +1 -1
- package/dist/plugins/pushcut/src/index.js +1 -1
- package/dist/plugins/pushover/src/credentials.js +1 -1
- package/dist/plugins/pushover/src/index.js +1 -1
- package/dist/plugins/quickbase/src/credentials.js +1 -1
- package/dist/plugins/quickbase/src/index.js +1 -1
- package/dist/plugins/quickbooks/src/credentials.js +1 -1
- package/dist/plugins/quickbooks/src/index.js +1 -1
- package/dist/plugins/raindrop/src/credentials.js +1 -1
- package/dist/plugins/raindrop/src/index.js +1 -1
- package/dist/plugins/recraft/src/credentials.js +1 -1
- package/dist/plugins/recraft/src/index.js +1 -1
- package/dist/plugins/reddit/src/credentials.js +1 -1
- package/dist/plugins/reddit/src/index.js +1 -1
- package/dist/plugins/replicate/src/credentials.js +1 -1
- package/dist/plugins/replicate/src/index.js +1 -1
- package/dist/plugins/rocketchat/src/credentials.js +1 -1
- package/dist/plugins/rocketchat/src/index.js +1 -1
- package/dist/plugins/rundeck/src/credentials.js +1 -1
- package/dist/plugins/rundeck/src/index.js +1 -1
- package/dist/plugins/salesforce/src/credentials.js +1 -2
- package/dist/plugins/salesforce/src/shared.js +1 -2
- package/dist/plugins/salesforce/src/sobjects.js +1 -1
- package/dist/plugins/salesmate/src/credentials.js +1 -1
- package/dist/plugins/salesmate/src/index.js +1 -1
- package/dist/plugins/securityScorecard/src/credentials.js +1 -1
- package/dist/plugins/securityScorecard/src/index.js +1 -1
- package/dist/plugins/segment/src/credentials.js +1 -1
- package/dist/plugins/segment/src/index.js +1 -1
- package/dist/plugins/sendgrid/src/credentials.js +1 -1
- package/dist/plugins/sendgrid/src/index.js +1 -2
- package/dist/plugins/sendy/src/credentials.js +1 -1
- package/dist/plugins/sendy/src/index.js +1 -1
- package/dist/plugins/sentry/src/credentials.js +1 -1
- package/dist/plugins/sentry/src/index.js +1 -1
- package/dist/plugins/servicenow/src/credentials.js +1 -1
- package/dist/plugins/servicenow/src/index.js +1 -1
- package/dist/plugins/shiftAtlas/src/graph.js +2 -1
- package/dist/plugins/shiftAtlas/src/shared.js +1 -1
- package/dist/plugins/shiftBwm/src/shared.js +2 -4
- package/dist/plugins/shiftCrm/src/access.js +2 -1
- package/dist/plugins/shiftCrm/src/accounts.js +2 -1
- package/dist/plugins/shiftCrm/src/imports.js +2 -1
- package/dist/plugins/shiftCrm/src/opportunities.js +2 -1
- package/dist/plugins/shiftCrm/src/people.js +2 -1
- package/dist/plugins/shiftCrm/src/records.js +2 -1
- package/dist/plugins/shiftCrm/src/shared.js +1 -1
- package/dist/plugins/shiftCrm/src/tasks.js +2 -1
- package/dist/plugins/shiftObjects/src/objects.js +2 -1
- package/dist/plugins/shiftOcr/src/index.js +2 -1
- package/dist/plugins/shiftPages/src/pages.js +2 -1
- package/dist/plugins/shiftPages/src/shared.js +3 -2
- package/dist/plugins/shiftTranscription/src/shared.js +1 -1
- package/dist/plugins/shiftTranscription/src/transcription.js +2 -1
- package/dist/plugins/shiftWork/src/issue-views.js +2 -1
- package/dist/plugins/shiftWork/src/issues.js +2 -1
- package/dist/plugins/shiftWork/src/projects.js +2 -1
- package/dist/plugins/shiftWork/src/shared.js +1 -1
- package/dist/plugins/shopify/src/credentials.js +1 -1
- package/dist/plugins/shopify/src/index.js +1 -1
- package/dist/plugins/signl4/src/credentials.js +1 -1
- package/dist/plugins/signl4/src/index.js +1 -1
- package/dist/plugins/slack/src/credentials.js +1 -1
- package/dist/plugins/slack/src/index.js +1 -1
- package/dist/plugins/sms77/src/credentials.js +1 -1
- package/dist/plugins/sms77/src/index.js +1 -1
- package/dist/plugins/splunk/src/credentials.js +1 -1
- package/dist/plugins/splunk/src/index.js +1 -1
- package/dist/plugins/spotify/src/credentials.js +1 -1
- package/dist/plugins/spotify/src/index.js +1 -1
- package/dist/plugins/stackby/src/credentials.js +1 -1
- package/dist/plugins/stackby/src/index.js +1 -1
- package/dist/plugins/steel/src/auth.js +1 -1
- package/dist/plugins/steel/src/browser.js +1 -1
- package/dist/plugins/steel/src/captchas.js +1 -1
- package/dist/plugins/steel/src/extensions.js +1 -1
- package/dist/plugins/steel/src/files.js +1 -1
- package/dist/plugins/steel/src/profiles.js +1 -1
- package/dist/plugins/steel/src/sessions.js +1 -1
- package/dist/plugins/steel/src/shared.js +1 -1
- package/dist/plugins/storyblok/src/credentials.js +1 -1
- package/dist/plugins/storyblok/src/index.js +1 -1
- package/dist/plugins/strapi/src/credentials.js +1 -1
- package/dist/plugins/strapi/src/index.js +1 -1
- package/dist/plugins/strava/src/credentials.js +1 -1
- package/dist/plugins/strava/src/index.js +1 -1
- package/dist/plugins/stripe/src/credentials.js +1 -1
- package/dist/plugins/stripe/src/index.js +1 -1
- package/dist/plugins/supabase/src/credentials.js +1 -1
- package/dist/plugins/supabase/src/index.js +1 -1
- package/dist/plugins/syncromsp/src/credentials.js +1 -1
- package/dist/plugins/syncromsp/src/index.js +1 -1
- package/dist/plugins/tapfiliate/src/credentials.js +1 -1
- package/dist/plugins/tapfiliate/src/index.js +1 -1
- package/dist/plugins/telegram/src/credentials.js +1 -1
- package/dist/plugins/telegram/src/index.js +1 -1
- package/dist/plugins/thehive/src/credentials.js +1 -1
- package/dist/plugins/thehive/src/index.js +1 -1
- package/dist/plugins/thehiveProject/src/credentials.js +1 -1
- package/dist/plugins/thehiveProject/src/index.js +1 -1
- package/dist/plugins/todoist/src/credentials.js +1 -1
- package/dist/plugins/todoist/src/index.js +1 -1
- package/dist/plugins/together/src/credentials.js +1 -1
- package/dist/plugins/together/src/index.js +1 -1
- package/dist/plugins/travisci/src/credentials.js +1 -1
- package/dist/plugins/travisci/src/index.js +1 -1
- package/dist/plugins/trello/src/credentials.js +1 -1
- package/dist/plugins/trello/src/index.js +1 -1
- package/dist/plugins/twake/src/credentials.js +1 -1
- package/dist/plugins/twake/src/index.js +1 -1
- package/dist/plugins/twilio/src/credentials.js +1 -1
- package/dist/plugins/twilio/src/index.js +1 -1
- package/dist/plugins/twist/src/credentials.js +1 -1
- package/dist/plugins/twist/src/index.js +1 -1
- package/dist/plugins/twitter/src/credentials.js +1 -1
- package/dist/plugins/twitter/src/index.js +1 -1
- package/dist/plugins/typesafe/src/credentials.js +1 -1
- package/dist/plugins/typesafe/src/shared.js +1 -1
- package/dist/plugins/unleashedSoftware/src/credentials.js +1 -1
- package/dist/plugins/unleashedSoftware/src/index.js +1 -1
- package/dist/plugins/uplead/src/credentials.js +1 -1
- package/dist/plugins/uplead/src/index.js +1 -1
- package/dist/plugins/uproc/src/credentials.js +1 -1
- package/dist/plugins/uproc/src/index.js +1 -1
- package/dist/plugins/uptimerobot/src/credentials.js +1 -1
- package/dist/plugins/uptimerobot/src/index.js +1 -1
- package/dist/plugins/urlscanio/src/credentials.js +1 -1
- package/dist/plugins/urlscanio/src/index.js +1 -1
- package/dist/plugins/vercel/src/credentials.js +1 -1
- package/dist/plugins/vercel/src/deployments.js +1 -1
- package/dist/plugins/vercel/src/env.js +1 -1
- package/dist/plugins/vercel/src/projects.js +1 -1
- package/dist/plugins/vercel/src/shared.js +1 -2
- package/dist/plugins/vero/src/credentials.js +1 -1
- package/dist/plugins/vero/src/index.js +1 -1
- package/dist/plugins/vonage/src/credentials.js +1 -1
- package/dist/plugins/vonage/src/index.js +1 -1
- package/dist/plugins/wekan/src/credentials.js +1 -1
- package/dist/plugins/wekan/src/index.js +1 -1
- package/dist/plugins/wolt/src/account.js +1 -1
- package/dist/plugins/wolt/src/credentials.js +1 -1
- package/dist/plugins/wolt/src/index.js +1 -1
- package/dist/plugins/wolt/src/shared.js +1 -2
- package/dist/plugins/woocommerce/src/credentials.js +1 -1
- package/dist/plugins/woocommerce/src/index.js +1 -1
- package/dist/plugins/wordpress/src/credentials.js +1 -1
- package/dist/plugins/wordpress/src/index.js +1 -1
- package/dist/plugins/xai/src/credentials.js +1 -1
- package/dist/plugins/xai/src/index.js +1 -1
- package/dist/plugins/xero/src/credentials.js +1 -1
- package/dist/plugins/xero/src/index.js +1 -1
- package/dist/plugins/yourls/src/credentials.js +1 -1
- package/dist/plugins/yourls/src/index.js +1 -1
- package/dist/plugins/zammad/src/credentials.js +1 -1
- package/dist/plugins/zammad/src/index.js +1 -1
- package/dist/plugins/zendesk/src/credentials.js +1 -1
- package/dist/plugins/zendesk/src/index.js +1 -1
- package/dist/plugins/zoho/src/credentials.js +1 -1
- package/dist/plugins/zoho/src/index.js +1 -1
- package/dist/plugins/zoom/src/credentials.js +1 -1
- package/dist/plugins/zoom/src/index.js +1 -1
- package/dist/plugins/zulip/src/credentials.js +1 -1
- package/dist/plugins/zulip/src/index.js +1 -1
- package/package.json +3 -2
package/dist/auth/errors.d.ts
CHANGED
|
@@ -8,9 +8,9 @@ declare const messages: {
|
|
|
8
8
|
readonly binding_changed: "Credential binding identity changed";
|
|
9
9
|
readonly unsupported_operation: "Authentication operation is not supported";
|
|
10
10
|
readonly invalid_response: "Invalid provider response";
|
|
11
|
-
readonly request_failed: "
|
|
12
|
-
readonly provider_rejected: "
|
|
13
|
-
readonly reconnect_required: "
|
|
11
|
+
readonly request_failed: "Token request failed; provider outcome may be unknown";
|
|
12
|
+
readonly provider_rejected: "Provider rejected the token request";
|
|
13
|
+
readonly reconnect_required: "Credential is no longer valid; reconnect the account";
|
|
14
14
|
};
|
|
15
15
|
export type AuthErrorCode = keyof typeof messages;
|
|
16
16
|
/** Safe to serialize. No raw response, endpoint URL, credential, or nested cause. */
|
package/dist/auth/errors.js
CHANGED
|
@@ -8,9 +8,9 @@ const messages = {
|
|
|
8
8
|
binding_changed: "Credential binding identity changed",
|
|
9
9
|
unsupported_operation: "Authentication operation is not supported",
|
|
10
10
|
invalid_response: "Invalid provider response",
|
|
11
|
-
request_failed: "
|
|
12
|
-
provider_rejected: "
|
|
13
|
-
reconnect_required: "
|
|
11
|
+
request_failed: "Token request failed; provider outcome may be unknown",
|
|
12
|
+
provider_rejected: "Provider rejected the token request",
|
|
13
|
+
reconnect_required: "Credential is no longer valid; reconnect the account",
|
|
14
14
|
};
|
|
15
15
|
/** Safe to serialize. No raw response, endpoint URL, credential, or nested cause. */
|
|
16
16
|
export class AuthError extends Error {
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The plugin side of AWS: one declaration for an AWS connection — an
|
|
3
|
+
* access key, or a role it assumes — and the request paths of the AWS
|
|
4
|
+
* protocols, all signed through the declared credential.
|
|
5
|
+
*/
|
|
6
|
+
import type { ActionContext } from "../plugin/types.js";
|
|
7
|
+
import type { CredentialDeclaration, CredentialProbe, CredentialTarget, HttpMethod } from "./types.js";
|
|
8
|
+
/**
|
|
9
|
+
* An AWS endpoint as a declared target: the service's regional HTTPS
|
|
10
|
+
* endpoint, signed for that service and region. `X-Amz-Target`, which
|
|
11
|
+
* names the operation of a JSON-protocol call, is always allowed.
|
|
12
|
+
*/
|
|
13
|
+
export declare function awsTarget(service: string, region: string, options?: {
|
|
14
|
+
methods?: HttpMethod[];
|
|
15
|
+
allowedHeaders?: string[];
|
|
16
|
+
timeoutMs?: number;
|
|
17
|
+
maxResponseBytes?: number;
|
|
18
|
+
}): CredentialTarget;
|
|
19
|
+
export interface AwsCredentialSpec {
|
|
20
|
+
/** Credential type id; one per provider family, shared by its plugins. */
|
|
21
|
+
id: string;
|
|
22
|
+
/** The endpoints the plugin calls (`awsTarget`), from public config. */
|
|
23
|
+
targets: (config: Readonly<Record<string, unknown>>) => Record<string, CredentialTarget>;
|
|
24
|
+
probe?: CredentialProbe;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* An AWS connection's declaration. The access key — `accessKeyId`,
|
|
28
|
+
* `secretAccessKey`, and a session's `sessionToken` — is the secret; the
|
|
29
|
+
* rest is public config:
|
|
30
|
+
*
|
|
31
|
+
* - `roleArn` selects `assumeRole`: the key only assumes the role, and
|
|
32
|
+
* requests sign with its sessions, renewed before they expire. Without
|
|
33
|
+
* it, `accessKey` signs with the key itself.
|
|
34
|
+
* - `roleSessionName` (default `runline`), `roleExternalId` and
|
|
35
|
+
* `roleDurationSeconds` shape each session request.
|
|
36
|
+
* - `stsRegion`, else `region`, else `us-east-1`, is where sessions are
|
|
37
|
+
* requested.
|
|
38
|
+
*/
|
|
39
|
+
export declare function awsCredential(spec: AwsCredentialSpec): CredentialDeclaration;
|
|
40
|
+
/**
|
|
41
|
+
* A failed AWS response by its status and the AWS error code it names
|
|
42
|
+
* (`AccessDeniedException`, `InvalidInstanceId.NotFound`). The message
|
|
43
|
+
* AWS sends with it, which can quote request data, never reaches the
|
|
44
|
+
* error. The status and code ride on the error for callers that branch.
|
|
45
|
+
*/
|
|
46
|
+
export declare function awsFailed(plugin: string, response: Response): Promise<Error & {
|
|
47
|
+
status: number;
|
|
48
|
+
code?: string;
|
|
49
|
+
}>;
|
|
50
|
+
/**
|
|
51
|
+
* One call of an AWS JSON-protocol service (SSM, CloudWatch Logs,
|
|
52
|
+
* Secrets Manager, CloudWatch): `operation` is the full
|
|
53
|
+
* `X-Amz-Target`, e.g. `AmazonSSM.SendCommand`; `version` is the
|
|
54
|
+
* service's JSON protocol version.
|
|
55
|
+
*/
|
|
56
|
+
export declare function awsJson<T = unknown>(ctx: ActionContext, declaration: CredentialDeclaration, plugin: string, call: {
|
|
57
|
+
target: string;
|
|
58
|
+
operation: string;
|
|
59
|
+
version: "1.0" | "1.1";
|
|
60
|
+
input?: unknown;
|
|
61
|
+
}): Promise<T>;
|
|
62
|
+
/**
|
|
63
|
+
* One call of an AWS Query-protocol service (EC2, STS): the action's
|
|
64
|
+
* parameters as the API names them, lists already numbered
|
|
65
|
+
* (`Filter.1.Name`). Answers the `<Action>Response` element as data;
|
|
66
|
+
* `awsList` reads its lists.
|
|
67
|
+
*/
|
|
68
|
+
export declare function awsQuery(ctx: ActionContext, declaration: CredentialDeclaration, plugin: string, call: {
|
|
69
|
+
target: string;
|
|
70
|
+
action: string;
|
|
71
|
+
version: string;
|
|
72
|
+
params?: Record<string, string | number | boolean | undefined>;
|
|
73
|
+
}): Promise<Record<string, unknown>>;
|
|
74
|
+
/**
|
|
75
|
+
* The entries of an AWS XML list: EC2's `<item>` and the query
|
|
76
|
+
* services' `<member>` elements, one or many, and none for an empty or
|
|
77
|
+
* absent list.
|
|
78
|
+
*/
|
|
79
|
+
export declare function awsList(value: unknown): unknown[];
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The plugin side of AWS: one declaration for an AWS connection — an
|
|
3
|
+
* access key, or a role it assumes — and the request paths of the AWS
|
|
4
|
+
* protocols, all signed through the declared credential.
|
|
5
|
+
*/
|
|
6
|
+
import * as t from "typebox";
|
|
7
|
+
import { AuthError } from "../auth/errors.js";
|
|
8
|
+
import { awsEndpoint, awsErrorCode, awsRole, parseAwsXml } from "./aws.js";
|
|
9
|
+
import { credentialRequest, errorIdentifier, failureMessage, jsonAnswer, } from "./plugin.js";
|
|
10
|
+
import { AwsAccessKeySchema, AwsSessionSchema } from "./registry.js";
|
|
11
|
+
const STRICT = { additionalProperties: false };
|
|
12
|
+
/**
|
|
13
|
+
* An AWS endpoint as a declared target: the service's regional HTTPS
|
|
14
|
+
* endpoint, signed for that service and region. `X-Amz-Target`, which
|
|
15
|
+
* names the operation of a JSON-protocol call, is always allowed.
|
|
16
|
+
*/
|
|
17
|
+
export function awsTarget(service, region, options = {}) {
|
|
18
|
+
// The endpoint refuses a malformed service or region, so the scope is sound.
|
|
19
|
+
return {
|
|
20
|
+
baseUrl: awsEndpoint(service, region),
|
|
21
|
+
methods: options.methods ?? ["GET", "POST"],
|
|
22
|
+
allowedHeaders: ["X-Amz-Target", ...(options.allowedHeaders ?? [])],
|
|
23
|
+
aws: { service, region },
|
|
24
|
+
...(options.timeoutMs !== undefined
|
|
25
|
+
? { timeoutMs: options.timeoutMs }
|
|
26
|
+
: {}),
|
|
27
|
+
...(options.maxResponseBytes !== undefined
|
|
28
|
+
? { maxResponseBytes: options.maxResponseBytes }
|
|
29
|
+
: {}),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/** A whole number from config, which a CLI or environment gives as a string. */
|
|
33
|
+
function configInteger(value) {
|
|
34
|
+
if (value === undefined || value === null || value === "")
|
|
35
|
+
return undefined;
|
|
36
|
+
const number = typeof value === "string" ? Number(value) : value;
|
|
37
|
+
if (typeof number !== "number" || !Number.isInteger(number))
|
|
38
|
+
throw new AuthError("invalid_credentials");
|
|
39
|
+
return number;
|
|
40
|
+
}
|
|
41
|
+
function configString(value) {
|
|
42
|
+
if (value === undefined || value === null || value === "")
|
|
43
|
+
return undefined;
|
|
44
|
+
if (typeof value !== "string")
|
|
45
|
+
throw new AuthError("invalid_credentials");
|
|
46
|
+
return value;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* An AWS connection's declaration. The access key — `accessKeyId`,
|
|
50
|
+
* `secretAccessKey`, and a session's `sessionToken` — is the secret; the
|
|
51
|
+
* rest is public config:
|
|
52
|
+
*
|
|
53
|
+
* - `roleArn` selects `assumeRole`: the key only assumes the role, and
|
|
54
|
+
* requests sign with its sessions, renewed before they expire. Without
|
|
55
|
+
* it, `accessKey` signs with the key itself.
|
|
56
|
+
* - `roleSessionName` (default `runline`), `roleExternalId` and
|
|
57
|
+
* `roleDurationSeconds` shape each session request.
|
|
58
|
+
* - `stsRegion`, else `region`, else `us-east-1`, is where sessions are
|
|
59
|
+
* requested.
|
|
60
|
+
*/
|
|
61
|
+
export function awsCredential(spec) {
|
|
62
|
+
const key = { credential: AwsAccessKeySchema };
|
|
63
|
+
const localSecret = {
|
|
64
|
+
accessKeyId: { field: "accessKeyId" },
|
|
65
|
+
secretAccessKey: { field: "secretAccessKey" },
|
|
66
|
+
sessionToken: { field: "sessionToken" },
|
|
67
|
+
};
|
|
68
|
+
return (config) => {
|
|
69
|
+
const targets = spec.targets(config);
|
|
70
|
+
const probe = spec.probe ? { probe: spec.probe } : {};
|
|
71
|
+
const roleArn = configString(config.roleArn);
|
|
72
|
+
const externalId = configString(config.roleExternalId);
|
|
73
|
+
const durationSeconds = configInteger(config.roleDurationSeconds);
|
|
74
|
+
return {
|
|
75
|
+
type: {
|
|
76
|
+
id: spec.id,
|
|
77
|
+
methods: {
|
|
78
|
+
accessKey: {
|
|
79
|
+
schema: t.Object(key, STRICT),
|
|
80
|
+
authentication: { kind: "awsSigV4", field: "credential" },
|
|
81
|
+
targets,
|
|
82
|
+
...probe,
|
|
83
|
+
},
|
|
84
|
+
assumeRole: {
|
|
85
|
+
schema: t.Object({ ...key, session: t.Optional(AwsSessionSchema) }, STRICT),
|
|
86
|
+
authentication: {
|
|
87
|
+
kind: "awsSigV4",
|
|
88
|
+
field: "credential",
|
|
89
|
+
assumeRole: { sessionField: "session" },
|
|
90
|
+
},
|
|
91
|
+
targets,
|
|
92
|
+
...probe,
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
localSecret,
|
|
97
|
+
...(roleArn === undefined
|
|
98
|
+
? { method: "accessKey" }
|
|
99
|
+
: {
|
|
100
|
+
method: "assumeRole",
|
|
101
|
+
awsRole: awsRole({
|
|
102
|
+
roleArn,
|
|
103
|
+
sessionName: configString(config.roleSessionName) ?? "runline",
|
|
104
|
+
...(externalId === undefined ? {} : { externalId }),
|
|
105
|
+
...(durationSeconds === undefined ? {} : { durationSeconds }),
|
|
106
|
+
region: configString(config.stsRegion) ??
|
|
107
|
+
configString(config.region) ??
|
|
108
|
+
"us-east-1",
|
|
109
|
+
}),
|
|
110
|
+
}),
|
|
111
|
+
};
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* A failed AWS response by its status and the AWS error code it names
|
|
116
|
+
* (`AccessDeniedException`, `InvalidInstanceId.NotFound`). The message
|
|
117
|
+
* AWS sends with it, which can quote request data, never reaches the
|
|
118
|
+
* error. The status and code ride on the error for callers that branch.
|
|
119
|
+
*/
|
|
120
|
+
export async function awsFailed(plugin, response) {
|
|
121
|
+
const code = errorIdentifier(awsErrorCode(await response.text()));
|
|
122
|
+
return Object.assign(new Error(failureMessage(plugin, response.status, { code })), { status: response.status, ...(code ? { code } : {}) });
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* One call of an AWS JSON-protocol service (SSM, CloudWatch Logs,
|
|
126
|
+
* Secrets Manager, CloudWatch): `operation` is the full
|
|
127
|
+
* `X-Amz-Target`, e.g. `AmazonSSM.SendCommand`; `version` is the
|
|
128
|
+
* service's JSON protocol version.
|
|
129
|
+
*/
|
|
130
|
+
export async function awsJson(ctx, declaration, plugin, call) {
|
|
131
|
+
const response = await credentialRequest(ctx, declaration, {
|
|
132
|
+
target: call.target,
|
|
133
|
+
path: "",
|
|
134
|
+
method: "POST",
|
|
135
|
+
headers: {
|
|
136
|
+
"Content-Type": `application/x-amz-json-${call.version}`,
|
|
137
|
+
"X-Amz-Target": call.operation,
|
|
138
|
+
},
|
|
139
|
+
body: JSON.stringify(call.input ?? {}),
|
|
140
|
+
});
|
|
141
|
+
if (!response.ok)
|
|
142
|
+
throw await awsFailed(plugin, response);
|
|
143
|
+
return jsonAnswer(response);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* One call of an AWS Query-protocol service (EC2, STS): the action's
|
|
147
|
+
* parameters as the API names them, lists already numbered
|
|
148
|
+
* (`Filter.1.Name`). Answers the `<Action>Response` element as data;
|
|
149
|
+
* `awsList` reads its lists.
|
|
150
|
+
*/
|
|
151
|
+
export async function awsQuery(ctx, declaration, plugin, call) {
|
|
152
|
+
const response = await credentialRequest(ctx, declaration, {
|
|
153
|
+
target: call.target,
|
|
154
|
+
path: "",
|
|
155
|
+
method: "POST",
|
|
156
|
+
headers: { Accept: "text/xml" },
|
|
157
|
+
form: { Action: call.action, Version: call.version, ...call.params },
|
|
158
|
+
});
|
|
159
|
+
if (!response.ok)
|
|
160
|
+
throw await awsFailed(plugin, response);
|
|
161
|
+
const answer = parseAwsXml(await response.text())[`${call.action}Response`];
|
|
162
|
+
if (!answer || typeof answer !== "object")
|
|
163
|
+
throw new AuthError("invalid_response");
|
|
164
|
+
return answer;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* The entries of an AWS XML list: EC2's `<item>` and the query
|
|
168
|
+
* services' `<member>` elements, one or many, and none for an empty or
|
|
169
|
+
* absent list.
|
|
170
|
+
*/
|
|
171
|
+
export function awsList(value) {
|
|
172
|
+
if (!value || typeof value !== "object")
|
|
173
|
+
return [];
|
|
174
|
+
const holder = value;
|
|
175
|
+
const entries = holder.item ?? holder.member;
|
|
176
|
+
if (entries === undefined || entries === "")
|
|
177
|
+
return [];
|
|
178
|
+
return Array.isArray(entries) ? entries : [entries];
|
|
179
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { AwsAccessKey, AwsRole, AwsSession } from "./types.js";
|
|
2
|
+
/** A region from public config; anything else would sign for the wrong place. */
|
|
3
|
+
export declare function awsRegion(value: unknown): string;
|
|
4
|
+
/** Whether a target's signing scope names a well-formed service and region. */
|
|
5
|
+
export declare function isAwsScope(value: unknown): boolean;
|
|
6
|
+
/**
|
|
7
|
+
* The regional HTTPS endpoint of `service`: `https://<service>.<region>.
|
|
8
|
+
* amazonaws.com/`, or `.amazonaws.com.cn` in the China partition.
|
|
9
|
+
*/
|
|
10
|
+
export declare function awsEndpoint(service: string, region: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* An access key that can sign: an ID and a session token that go into
|
|
13
|
+
* headers as they are (`secret`), and a secret that only keys the
|
|
14
|
+
* signature. Anything else is refused before any request.
|
|
15
|
+
*/
|
|
16
|
+
export declare function awsAccessKey(value: unknown): AwsAccessKey;
|
|
17
|
+
/** A role as STS accepts it; anything else is refused before any request. */
|
|
18
|
+
export declare function awsRole(role: AwsRole): AwsRole;
|
|
19
|
+
/**
|
|
20
|
+
* An AWS XML answer as plain data. Element text is a string; lists are
|
|
21
|
+
* `item` or `member` entries. AWS sends no document type, and one that
|
|
22
|
+
* declares entities could expand without bound, so a DOCTYPE is refused.
|
|
23
|
+
*/
|
|
24
|
+
export declare function parseAwsXml(text: string): Record<string, unknown>;
|
|
25
|
+
/**
|
|
26
|
+
* An AWS error's code, from any of its envelopes: a JSON `__type`
|
|
27
|
+
* (`com.amazonaws.ssm#InvalidInstanceId` → `InvalidInstanceId`) or `code`,
|
|
28
|
+
* a query `ErrorResponse`, or EC2's `Response.Errors`. Undefined when the
|
|
29
|
+
* body names none.
|
|
30
|
+
*/
|
|
31
|
+
export declare function awsErrorCode(text: string): string | undefined;
|
|
32
|
+
export interface AssumeRoleOptions {
|
|
33
|
+
fetch: typeof globalThis.fetch;
|
|
34
|
+
timeoutMs: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* A new session for `role`, requested from STS with `key`. A refused
|
|
38
|
+
* key is reconnect_required; any other refusal (no permission to assume
|
|
39
|
+
* the role, a trust policy mismatch) is provider_rejected.
|
|
40
|
+
*/
|
|
41
|
+
export declare function assumeAwsRole(key: AwsAccessKey, role: AwsRole, options: AssumeRoleOptions): Promise<Omit<AwsSession, "revision">>;
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { XMLParser } from "fast-xml-parser";
|
|
2
|
+
import { AuthError } from "../auth/errors.js";
|
|
3
|
+
import { sendResource } from "./http.js";
|
|
4
|
+
import { secret } from "./policy.js";
|
|
5
|
+
import { signSigV4 } from "./sigv4.js";
|
|
6
|
+
/**
|
|
7
|
+
* AWS endpoints, roles and responses: what SigV4 methods sign for, and
|
|
8
|
+
* how a role session is issued. The signature itself is sigv4.ts.
|
|
9
|
+
*/
|
|
10
|
+
/** A region code: `us-east-1`, `eu-central-2`, `us-gov-west-1`, `cn-north-1`. */
|
|
11
|
+
const REGION = /^[a-z]{2}(?:-[a-z]+)+-\d{1,2}$/;
|
|
12
|
+
/** A service's endpoint prefix: `ec2`, `ssm`, `logs`, `monitoring`. */
|
|
13
|
+
const SERVICE = /^[a-z0-9][a-z0-9-]{0,62}$/;
|
|
14
|
+
/** A region from public config; anything else would sign for the wrong place. */
|
|
15
|
+
export function awsRegion(value) {
|
|
16
|
+
if (typeof value !== "string" || !REGION.test(value))
|
|
17
|
+
throw new AuthError("invalid_credentials");
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
/** Whether a target's signing scope names a well-formed service and region. */
|
|
21
|
+
export function isAwsScope(value) {
|
|
22
|
+
const scope = value;
|
|
23
|
+
return (!!scope &&
|
|
24
|
+
typeof scope.service === "string" &&
|
|
25
|
+
SERVICE.test(scope.service) &&
|
|
26
|
+
typeof scope.region === "string" &&
|
|
27
|
+
REGION.test(scope.region));
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* The regional HTTPS endpoint of `service`: `https://<service>.<region>.
|
|
31
|
+
* amazonaws.com/`, or `.amazonaws.com.cn` in the China partition.
|
|
32
|
+
*/
|
|
33
|
+
export function awsEndpoint(service, region) {
|
|
34
|
+
if (!SERVICE.test(service))
|
|
35
|
+
throw new AuthError("invalid_definition");
|
|
36
|
+
const domain = awsRegion(region).startsWith("cn-")
|
|
37
|
+
? "amazonaws.com.cn"
|
|
38
|
+
: "amazonaws.com";
|
|
39
|
+
return `https://${service}.${region}.${domain}/`;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* An access key that can sign: an ID and a session token that go into
|
|
43
|
+
* headers as they are (`secret`), and a secret that only keys the
|
|
44
|
+
* signature. Anything else is refused before any request.
|
|
45
|
+
*/
|
|
46
|
+
export function awsAccessKey(value) {
|
|
47
|
+
const key = value;
|
|
48
|
+
if (typeof key?.secretAccessKey !== "string" || !key.secretAccessKey)
|
|
49
|
+
throw new AuthError("invalid_credentials");
|
|
50
|
+
return {
|
|
51
|
+
accessKeyId: secret(key.accessKeyId),
|
|
52
|
+
secretAccessKey: key.secretAccessKey,
|
|
53
|
+
...(key.sessionToken === undefined
|
|
54
|
+
? {}
|
|
55
|
+
: { sessionToken: secret(key.sessionToken) }),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/** `arn:<partition>:iam::<account>:role/<path/name>`, as IAM allows it. */
|
|
59
|
+
const ROLE_ARN = /^arn:aws(?:-[a-z]+)*:iam::\d{12}:role\/[\w+=,.@/-]{1,512}$/;
|
|
60
|
+
const SESSION_NAME = /^[\w+=,.@-]{2,64}$/;
|
|
61
|
+
const EXTERNAL_ID = /^[\w+=,.@:/-]{2,1224}$/;
|
|
62
|
+
/** A role as STS accepts it; anything else is refused before any request. */
|
|
63
|
+
export function awsRole(role) {
|
|
64
|
+
if (!ROLE_ARN.test(role.roleArn) ||
|
|
65
|
+
!SESSION_NAME.test(role.sessionName) ||
|
|
66
|
+
(role.externalId !== undefined && !EXTERNAL_ID.test(role.externalId)) ||
|
|
67
|
+
(role.durationSeconds !== undefined &&
|
|
68
|
+
(!Number.isInteger(role.durationSeconds) ||
|
|
69
|
+
role.durationSeconds < 900 ||
|
|
70
|
+
role.durationSeconds > 43_200)))
|
|
71
|
+
throw new AuthError("invalid_credentials");
|
|
72
|
+
return { ...role, region: awsRegion(role.region) };
|
|
73
|
+
}
|
|
74
|
+
const xml = new XMLParser({
|
|
75
|
+
ignoreAttributes: true,
|
|
76
|
+
ignoreDeclaration: true,
|
|
77
|
+
// Values stay strings: an account ID or a volume size is not ours to coerce.
|
|
78
|
+
parseTagValue: false,
|
|
79
|
+
trimValues: true,
|
|
80
|
+
processEntities: true,
|
|
81
|
+
htmlEntities: false,
|
|
82
|
+
});
|
|
83
|
+
/**
|
|
84
|
+
* An AWS XML answer as plain data. Element text is a string; lists are
|
|
85
|
+
* `item` or `member` entries. AWS sends no document type, and one that
|
|
86
|
+
* declares entities could expand without bound, so a DOCTYPE is refused.
|
|
87
|
+
*/
|
|
88
|
+
export function parseAwsXml(text) {
|
|
89
|
+
if (/<!DOCTYPE/i.test(text))
|
|
90
|
+
throw new AuthError("invalid_response");
|
|
91
|
+
try {
|
|
92
|
+
const parsed = xml.parse(text, true);
|
|
93
|
+
if (!parsed || typeof parsed !== "object")
|
|
94
|
+
throw new Error();
|
|
95
|
+
return parsed;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
throw new AuthError("invalid_response");
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* An AWS error's code, from any of its envelopes: a JSON `__type`
|
|
103
|
+
* (`com.amazonaws.ssm#InvalidInstanceId` → `InvalidInstanceId`) or `code`,
|
|
104
|
+
* a query `ErrorResponse`, or EC2's `Response.Errors`. Undefined when the
|
|
105
|
+
* body names none.
|
|
106
|
+
*/
|
|
107
|
+
export function awsErrorCode(text) {
|
|
108
|
+
const trimmed = text.trim();
|
|
109
|
+
if (trimmed.startsWith("{")) {
|
|
110
|
+
try {
|
|
111
|
+
const body = JSON.parse(trimmed);
|
|
112
|
+
const code = body.__type ?? body.code ?? body.Code;
|
|
113
|
+
return typeof code === "string" ? code.split("#").pop() : undefined;
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (!trimmed.startsWith("<"))
|
|
120
|
+
return undefined;
|
|
121
|
+
try {
|
|
122
|
+
const body = parseAwsXml(trimmed);
|
|
123
|
+
const envelope = (body.ErrorResponse ?? body.Response);
|
|
124
|
+
const error = (envelope?.Error ??
|
|
125
|
+
envelope?.Errors?.Error);
|
|
126
|
+
const first = Array.isArray(error) ? error[0] : error;
|
|
127
|
+
return typeof first?.Code === "string" ? first.Code : undefined;
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return undefined;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/** STS codes that mean the signing key itself is unusable: a reconnect, not a retry. */
|
|
134
|
+
const REJECTED_KEY = new Set([
|
|
135
|
+
"InvalidClientTokenId",
|
|
136
|
+
"SignatureDoesNotMatch",
|
|
137
|
+
"ExpiredToken",
|
|
138
|
+
"InvalidAccessKeyId",
|
|
139
|
+
"UnrecognizedClientException",
|
|
140
|
+
]);
|
|
141
|
+
/**
|
|
142
|
+
* A new session for `role`, requested from STS with `key`. A refused
|
|
143
|
+
* key is reconnect_required; any other refusal (no permission to assume
|
|
144
|
+
* the role, a trust policy mismatch) is provider_rejected.
|
|
145
|
+
*/
|
|
146
|
+
export async function assumeAwsRole(key, role, options) {
|
|
147
|
+
const signing = awsAccessKey(key);
|
|
148
|
+
const valid = awsRole(role);
|
|
149
|
+
const endpoint = new URL(awsEndpoint("sts", valid.region));
|
|
150
|
+
const body = Buffer.from(new URLSearchParams({
|
|
151
|
+
Action: "AssumeRole",
|
|
152
|
+
Version: "2011-06-15",
|
|
153
|
+
RoleArn: valid.roleArn,
|
|
154
|
+
RoleSessionName: valid.sessionName,
|
|
155
|
+
...(valid.externalId === undefined
|
|
156
|
+
? {}
|
|
157
|
+
: { ExternalId: valid.externalId }),
|
|
158
|
+
...(valid.durationSeconds === undefined
|
|
159
|
+
? {}
|
|
160
|
+
: { DurationSeconds: String(valid.durationSeconds) }),
|
|
161
|
+
}).toString());
|
|
162
|
+
const contentType = "application/x-www-form-urlencoded; charset=utf-8";
|
|
163
|
+
const now = Date.now();
|
|
164
|
+
const signed = signSigV4({
|
|
165
|
+
method: "POST",
|
|
166
|
+
host: endpoint.host,
|
|
167
|
+
path: endpoint.pathname,
|
|
168
|
+
query: [],
|
|
169
|
+
headers: [["content-type", contentType]],
|
|
170
|
+
body,
|
|
171
|
+
}, signing, { service: "sts", region: valid.region }, new Date(now));
|
|
172
|
+
let response;
|
|
173
|
+
try {
|
|
174
|
+
response = await sendResource(endpoint.toString(), "POST", new Headers({ "content-type": contentType, ...signed }), body, {
|
|
175
|
+
fetch: options.fetch,
|
|
176
|
+
timeoutMs: options.timeoutMs,
|
|
177
|
+
maxResponseBytes: 64 * 1024,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
throw new AuthError("request_failed");
|
|
182
|
+
}
|
|
183
|
+
const text = await response.text();
|
|
184
|
+
if (!response.ok) {
|
|
185
|
+
const code = awsErrorCode(text);
|
|
186
|
+
throw new AuthError(code && REJECTED_KEY.has(code)
|
|
187
|
+
? "reconnect_required"
|
|
188
|
+
: "provider_rejected", response.status);
|
|
189
|
+
}
|
|
190
|
+
const result = parseAwsXml(text).AssumeRoleResponse?.AssumeRoleResult?.Credentials;
|
|
191
|
+
const expiresAt = Date.parse(String(result?.Expiration));
|
|
192
|
+
if (typeof result?.SessionToken !== "string" ||
|
|
193
|
+
!Number.isSafeInteger(expiresAt) ||
|
|
194
|
+
expiresAt <= now)
|
|
195
|
+
throw new AuthError("invalid_response");
|
|
196
|
+
let session;
|
|
197
|
+
try {
|
|
198
|
+
session = awsAccessKey({
|
|
199
|
+
accessKeyId: result.AccessKeyId,
|
|
200
|
+
secretAccessKey: result.SecretAccessKey,
|
|
201
|
+
sessionToken: result.SessionToken,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
throw new AuthError("invalid_response");
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
accessKeyId: session.accessKeyId,
|
|
209
|
+
secretAccessKey: session.secretAccessKey,
|
|
210
|
+
sessionToken: result.SessionToken,
|
|
211
|
+
expiresAt,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ActionContext } from "../plugin/types.js";
|
|
2
|
+
import { type CredentialBroker } from "./transport.js";
|
|
3
|
+
import type { CredentialDeclaration } from "./types.js";
|
|
4
|
+
/**
|
|
5
|
+
* Where one action call's authenticated requests go: the host's broker
|
|
6
|
+
* when it supplies one — the credentials then live with the host, and no
|
|
7
|
+
* local signer is built — else this process signs with its own
|
|
8
|
+
* connection, from the plugin's declaration. Plugin-side: the host-side
|
|
9
|
+
* `credentialBroker` option is what supplies `ctx.credentials`.
|
|
10
|
+
*/
|
|
11
|
+
export declare function brokerFor(ctx: ActionContext, declaration: CredentialDeclaration): CredentialBroker;
|