@strapi/plugin-users-permissions 0.0.0-experimental.6340da17068c3bed7fb006e7bcc554c71129e282 → 0.0.0-experimental.63624e21eb5b0713345a0cf2f68f1c40eab427bc
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/.eslintrc.cjs +2 -0
- package/admin/src/pages/EmailTemplates/components/EmailForm.jsx +3 -1
- package/admin/src/pages/Roles/pages/EditPage.jsx +1 -1
- package/admin/src/pages/Roles/pages/ListPage/index.jsx +1 -1
- package/admin/src/translations/en.json +1 -0
- package/admin/src/translations/es.json +1 -1
- package/admin/src/translations/ko.json +2 -1
- package/admin/src/translations/sv.json +1 -1
- package/admin/src/translations/uk.json +1 -1
- package/dist/admin/pages/EmailTemplates/components/EmailForm.js +2 -1
- package/dist/admin/pages/EmailTemplates/components/EmailForm.js.map +1 -1
- package/dist/admin/pages/EmailTemplates/components/EmailForm.mjs +2 -1
- package/dist/admin/pages/EmailTemplates/components/EmailForm.mjs.map +1 -1
- package/dist/admin/pages/Roles/pages/EditPage.js +1 -1
- package/dist/admin/pages/Roles/pages/EditPage.js.map +1 -1
- package/dist/admin/pages/Roles/pages/EditPage.mjs +1 -1
- package/dist/admin/pages/Roles/pages/EditPage.mjs.map +1 -1
- package/dist/admin/pages/Roles/pages/ListPage/index.js +1 -1
- package/dist/admin/pages/Roles/pages/ListPage/index.js.map +1 -1
- package/dist/admin/pages/Roles/pages/ListPage/index.mjs +1 -1
- package/dist/admin/pages/Roles/pages/ListPage/index.mjs.map +1 -1
- package/dist/admin/translations/en.json.js +1 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +1 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/translations/es.json.js +1 -1
- package/dist/admin/translations/es.json.mjs +1 -1
- package/dist/admin/translations/ko.json.js +2 -1
- package/dist/admin/translations/ko.json.js.map +1 -1
- package/dist/admin/translations/ko.json.mjs +2 -1
- package/dist/admin/translations/ko.json.mjs.map +1 -1
- package/dist/admin/translations/sv.json.js +1 -1
- package/dist/admin/translations/sv.json.mjs +1 -1
- package/dist/admin/translations/uk.json.js +1 -1
- package/dist/admin/translations/uk.json.mjs +1 -1
- package/dist/server/_virtual/_node_crypto.js +10 -0
- package/dist/server/_virtual/_node_crypto.js.map +1 -0
- package/dist/server/_virtual/_node_crypto.mjs +7 -0
- package/dist/server/_virtual/_node_crypto.mjs.map +1 -0
- package/dist/server/_virtual/_node_url.js +10 -0
- package/dist/server/_virtual/_node_url.js.map +1 -0
- package/dist/server/_virtual/_node_url.mjs +7 -0
- package/dist/server/_virtual/_node_url.mjs.map +1 -0
- package/dist/server/bootstrap/index.js.map +1 -1
- package/dist/server/bootstrap/index.mjs.map +1 -1
- package/dist/server/bootstrap/users-permissions-actions.js.map +1 -1
- package/dist/server/bootstrap/users-permissions-actions.mjs.map +1 -1
- package/dist/server/config.js.map +1 -1
- package/dist/server/config.mjs.map +1 -1
- package/dist/server/content-types/index.js.map +1 -1
- package/dist/server/content-types/index.mjs.map +1 -1
- package/dist/server/content-types/permission/index.js.map +1 -1
- package/dist/server/content-types/permission/index.mjs.map +1 -1
- package/dist/server/content-types/role/index.js.map +1 -1
- package/dist/server/content-types/role/index.mjs.map +1 -1
- package/dist/server/content-types/user/index.js.map +1 -1
- package/dist/server/content-types/user/index.mjs.map +1 -1
- package/dist/server/content-types/user/schema-config.js.map +1 -1
- package/dist/server/content-types/user/schema-config.mjs.map +1 -1
- package/dist/server/controllers/auth.js +38 -30
- package/dist/server/controllers/auth.js.map +1 -1
- package/dist/server/controllers/auth.mjs +38 -28
- package/dist/server/controllers/auth.mjs.map +1 -1
- package/dist/server/controllers/content-manager-user.js.map +1 -1
- package/dist/server/controllers/content-manager-user.mjs.map +1 -1
- package/dist/server/controllers/index.js.map +1 -1
- package/dist/server/controllers/index.mjs.map +1 -1
- package/dist/server/controllers/permissions.js.map +1 -1
- package/dist/server/controllers/permissions.mjs.map +1 -1
- package/dist/server/controllers/role.js.map +1 -1
- package/dist/server/controllers/role.mjs.map +1 -1
- package/dist/server/controllers/settings.js.map +1 -1
- package/dist/server/controllers/settings.mjs.map +1 -1
- package/dist/server/controllers/user.js.map +1 -1
- package/dist/server/controllers/user.mjs.map +1 -1
- package/dist/server/controllers/validation/auth.js +6 -6
- package/dist/server/controllers/validation/auth.js.map +1 -1
- package/dist/server/controllers/validation/auth.mjs +6 -6
- package/dist/server/controllers/validation/auth.mjs.map +1 -1
- package/dist/server/controllers/validation/email-template.js +1 -4
- package/dist/server/controllers/validation/email-template.js.map +1 -1
- package/dist/server/controllers/validation/email-template.mjs +1 -3
- package/dist/server/controllers/validation/email-template.mjs.map +1 -1
- package/dist/server/controllers/validation/user.js.map +1 -1
- package/dist/server/controllers/validation/user.mjs.map +1 -1
- package/dist/server/graphql/index.js.map +1 -1
- package/dist/server/graphql/index.mjs.map +1 -1
- package/dist/server/graphql/mutations/auth/change-password.js +7 -4
- package/dist/server/graphql/mutations/auth/change-password.js.map +1 -1
- package/dist/server/graphql/mutations/auth/change-password.mjs +7 -4
- package/dist/server/graphql/mutations/auth/change-password.mjs.map +1 -1
- package/dist/server/graphql/mutations/auth/email-confirmation.js +1 -1
- package/dist/server/graphql/mutations/auth/email-confirmation.js.map +1 -1
- package/dist/server/graphql/mutations/auth/email-confirmation.mjs +1 -1
- package/dist/server/graphql/mutations/auth/email-confirmation.mjs.map +1 -1
- package/dist/server/graphql/mutations/auth/forgot-password.js +7 -4
- package/dist/server/graphql/mutations/auth/forgot-password.js.map +1 -1
- package/dist/server/graphql/mutations/auth/forgot-password.mjs +7 -4
- package/dist/server/graphql/mutations/auth/forgot-password.mjs.map +1 -1
- package/dist/server/graphql/mutations/auth/login.js +10 -7
- package/dist/server/graphql/mutations/auth/login.js.map +1 -1
- package/dist/server/graphql/mutations/auth/login.mjs +10 -7
- package/dist/server/graphql/mutations/auth/login.mjs.map +1 -1
- package/dist/server/graphql/mutations/auth/rate-limit.js +63 -0
- package/dist/server/graphql/mutations/auth/rate-limit.js.map +1 -0
- package/dist/server/graphql/mutations/auth/rate-limit.mjs +61 -0
- package/dist/server/graphql/mutations/auth/rate-limit.mjs.map +1 -0
- package/dist/server/graphql/mutations/auth/register.js +7 -4
- package/dist/server/graphql/mutations/auth/register.js.map +1 -1
- package/dist/server/graphql/mutations/auth/register.mjs +7 -4
- package/dist/server/graphql/mutations/auth/register.mjs.map +1 -1
- package/dist/server/graphql/mutations/auth/reset-password.js +7 -4
- package/dist/server/graphql/mutations/auth/reset-password.js.map +1 -1
- package/dist/server/graphql/mutations/auth/reset-password.mjs +7 -4
- package/dist/server/graphql/mutations/auth/reset-password.mjs.map +1 -1
- package/dist/server/graphql/mutations/crud/role/create-role.js +1 -1
- package/dist/server/graphql/mutations/crud/role/create-role.js.map +1 -1
- package/dist/server/graphql/mutations/crud/role/create-role.mjs +1 -1
- package/dist/server/graphql/mutations/crud/role/create-role.mjs.map +1 -1
- package/dist/server/graphql/mutations/crud/role/delete-role.js.map +1 -1
- package/dist/server/graphql/mutations/crud/role/delete-role.mjs.map +1 -1
- package/dist/server/graphql/mutations/crud/role/update-role.js.map +1 -1
- package/dist/server/graphql/mutations/crud/role/update-role.mjs.map +1 -1
- package/dist/server/graphql/mutations/crud/user/create-user.js +1 -1
- package/dist/server/graphql/mutations/crud/user/create-user.js.map +1 -1
- package/dist/server/graphql/mutations/crud/user/create-user.mjs +1 -1
- package/dist/server/graphql/mutations/crud/user/create-user.mjs.map +1 -1
- package/dist/server/graphql/mutations/crud/user/delete-user.js.map +1 -1
- package/dist/server/graphql/mutations/crud/user/delete-user.mjs.map +1 -1
- package/dist/server/graphql/mutations/crud/user/update-user.js +1 -1
- package/dist/server/graphql/mutations/crud/user/update-user.js.map +1 -1
- package/dist/server/graphql/mutations/crud/user/update-user.mjs +1 -1
- package/dist/server/graphql/mutations/crud/user/update-user.mjs.map +1 -1
- package/dist/server/graphql/mutations/index.js.map +1 -1
- package/dist/server/graphql/mutations/index.mjs.map +1 -1
- package/dist/server/graphql/queries/index.js.map +1 -1
- package/dist/server/graphql/queries/index.mjs.map +1 -1
- package/dist/server/graphql/queries/me.js.map +1 -1
- package/dist/server/graphql/queries/me.mjs.map +1 -1
- package/dist/server/graphql/resolvers-configs.js.map +1 -1
- package/dist/server/graphql/resolvers-configs.mjs.map +1 -1
- package/dist/server/graphql/types/create-role-payload.js.map +1 -1
- package/dist/server/graphql/types/create-role-payload.mjs.map +1 -1
- package/dist/server/graphql/types/delete-role-payload.js.map +1 -1
- package/dist/server/graphql/types/delete-role-payload.mjs.map +1 -1
- package/dist/server/graphql/types/index.js.map +1 -1
- package/dist/server/graphql/types/index.mjs.map +1 -1
- package/dist/server/graphql/types/login-input.js.map +1 -1
- package/dist/server/graphql/types/login-input.mjs.map +1 -1
- package/dist/server/graphql/types/login-payload.js.map +1 -1
- package/dist/server/graphql/types/login-payload.mjs.map +1 -1
- package/dist/server/graphql/types/me-role.js.map +1 -1
- package/dist/server/graphql/types/me-role.mjs.map +1 -1
- package/dist/server/graphql/types/me.js.map +1 -1
- package/dist/server/graphql/types/me.mjs.map +1 -1
- package/dist/server/graphql/types/password-payload.js.map +1 -1
- package/dist/server/graphql/types/password-payload.mjs.map +1 -1
- package/dist/server/graphql/types/register-input.js.map +1 -1
- package/dist/server/graphql/types/register-input.mjs.map +1 -1
- package/dist/server/graphql/types/update-role-payload.js.map +1 -1
- package/dist/server/graphql/types/update-role-payload.mjs.map +1 -1
- package/dist/server/graphql/types/user-input.js.map +1 -1
- package/dist/server/graphql/types/user-input.mjs.map +1 -1
- package/dist/server/graphql/utils.js +4 -4
- package/dist/server/graphql/utils.js.map +1 -1
- package/dist/server/graphql/utils.mjs +4 -4
- package/dist/server/graphql/utils.mjs.map +1 -1
- package/dist/server/index.js +2 -2
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +3 -3
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/index2.js +8 -8
- package/dist/server/index2.js.map +1 -1
- package/dist/server/index2.mjs +8 -8
- package/dist/server/index2.mjs.map +1 -1
- package/dist/server/middlewares/index.js.map +1 -1
- package/dist/server/middlewares/index.mjs.map +1 -1
- package/dist/server/middlewares/rateLimit.js +5 -5
- package/dist/server/middlewares/rateLimit.js.map +1 -1
- package/dist/server/middlewares/rateLimit.mjs +5 -5
- package/dist/server/middlewares/rateLimit.mjs.map +1 -1
- package/dist/server/register.js.map +1 -1
- package/dist/server/register.mjs.map +1 -1
- package/dist/server/routes/admin/index.js.map +1 -1
- package/dist/server/routes/admin/index.mjs.map +1 -1
- package/dist/server/routes/admin/permissions.js.map +1 -1
- package/dist/server/routes/admin/permissions.mjs.map +1 -1
- package/dist/server/routes/admin/role.js.map +1 -1
- package/dist/server/routes/admin/role.mjs.map +1 -1
- package/dist/server/routes/admin/settings.js.map +1 -1
- package/dist/server/routes/admin/settings.mjs.map +1 -1
- package/dist/server/routes/content-api/auth.js.map +1 -1
- package/dist/server/routes/content-api/auth.mjs.map +1 -1
- package/dist/server/routes/content-api/index.js.map +1 -1
- package/dist/server/routes/content-api/index.mjs.map +1 -1
- package/dist/server/routes/content-api/permissions.js.map +1 -1
- package/dist/server/routes/content-api/permissions.mjs.map +1 -1
- package/dist/server/routes/content-api/role.js.map +1 -1
- package/dist/server/routes/content-api/role.mjs.map +1 -1
- package/dist/server/routes/content-api/user.js.map +1 -1
- package/dist/server/routes/content-api/user.mjs.map +1 -1
- package/dist/server/routes/content-api/validation.js.map +1 -1
- package/dist/server/routes/content-api/validation.mjs.map +1 -1
- package/dist/server/routes/index.js.map +1 -1
- package/dist/server/routes/index.mjs.map +1 -1
- package/dist/server/services/constants.js.map +1 -1
- package/dist/server/services/constants.mjs.map +1 -1
- package/dist/server/services/index.js.map +1 -1
- package/dist/server/services/index.mjs.map +1 -1
- package/dist/server/services/jwt.js.map +1 -1
- package/dist/server/services/jwt.mjs.map +1 -1
- package/dist/server/services/permission.js.map +1 -1
- package/dist/server/services/permission.mjs.map +1 -1
- package/dist/server/services/providers-registry.js +188 -248
- package/dist/server/services/providers-registry.js.map +1 -1
- package/dist/server/services/providers-registry.mjs +188 -245
- package/dist/server/services/providers-registry.mjs.map +1 -1
- package/dist/server/services/providers.js +15 -11
- package/dist/server/services/providers.js.map +1 -1
- package/dist/server/services/providers.mjs +14 -10
- package/dist/server/services/providers.mjs.map +1 -1
- package/dist/server/services/role.js +2 -2
- package/dist/server/services/role.js.map +1 -1
- package/dist/server/services/role.mjs +2 -2
- package/dist/server/services/role.mjs.map +1 -1
- package/dist/server/services/user.js +14 -14
- package/dist/server/services/user.js.map +1 -1
- package/dist/server/services/user.mjs +13 -13
- package/dist/server/services/user.mjs.map +1 -1
- package/dist/server/services/users-permissions.js +17 -20
- package/dist/server/services/users-permissions.js.map +1 -1
- package/dist/server/services/users-permissions.mjs +16 -18
- package/dist/server/services/users-permissions.mjs.map +1 -1
- package/dist/server/strategies/users-permissions.js +9 -8
- package/dist/server/strategies/users-permissions.js.map +1 -1
- package/dist/server/strategies/users-permissions.mjs +9 -8
- package/dist/server/strategies/users-permissions.mjs.map +1 -1
- package/dist/server/utils/index.js.map +1 -1
- package/dist/server/utils/index.mjs.map +1 -1
- package/dist/server/utils/oauth-connect/index.js +241 -0
- package/dist/server/utils/oauth-connect/index.js.map +1 -0
- package/dist/server/utils/oauth-connect/index.mjs +235 -0
- package/dist/server/utils/oauth-connect/index.mjs.map +1 -0
- package/dist/server/utils/oauth-connect/oauth1.js +138 -0
- package/dist/server/utils/oauth-connect/oauth1.js.map +1 -0
- package/dist/server/utils/oauth-connect/oauth1.mjs +136 -0
- package/dist/server/utils/oauth-connect/oauth1.mjs.map +1 -0
- package/dist/server/utils/oauth-connect/oauth2.js +117 -0
- package/dist/server/utils/oauth-connect/oauth2.js.map +1 -0
- package/dist/server/utils/oauth-connect/oauth2.mjs +115 -0
- package/dist/server/utils/oauth-connect/oauth2.mjs.map +1 -0
- package/dist/server/utils/oauth-connect/providers.js +109 -0
- package/dist/server/utils/oauth-connect/providers.js.map +1 -0
- package/dist/server/utils/oauth-connect/providers.mjs +107 -0
- package/dist/server/utils/oauth-connect/providers.mjs.map +1 -0
- package/dist/server/utils/provider-http.js +52 -0
- package/dist/server/utils/provider-http.js.map +1 -0
- package/dist/server/utils/provider-http.mjs +50 -0
- package/dist/server/utils/provider-http.mjs.map +1 -0
- package/dist/server/utils/refresh-cookie-options.js.map +1 -1
- package/dist/server/utils/refresh-cookie-options.mjs.map +1 -1
- package/dist/server/utils/sanitize/index.js.map +1 -1
- package/dist/server/utils/sanitize/index.mjs.map +1 -1
- package/dist/server/utils/sanitize/sanitizers.js +1 -1
- package/dist/server/utils/sanitize/sanitizers.js.map +1 -1
- package/dist/server/utils/sanitize/sanitizers.mjs +1 -1
- package/dist/server/utils/sanitize/sanitizers.mjs.map +1 -1
- package/dist/server/utils/sanitize/visitors/index.js.map +1 -1
- package/dist/server/utils/sanitize/visitors/index.mjs.map +1 -1
- package/dist/server/utils/sanitize/visitors/remove-user-relation-from-role-entities.js.map +1 -1
- package/dist/server/utils/sanitize/visitors/remove-user-relation-from-role-entities.mjs.map +1 -1
- package/dist/server/utils/trim-grant-session-response.js +67 -0
- package/dist/server/utils/trim-grant-session-response.js.map +1 -0
- package/dist/server/utils/trim-grant-session-response.mjs +65 -0
- package/dist/server/utils/trim-grant-session-response.mjs.map +1 -0
- package/dist/server/utils/verify-jwt-with-jwks.js +60 -0
- package/dist/server/utils/verify-jwt-with-jwks.js.map +1 -0
- package/dist/server/utils/verify-jwt-with-jwks.mjs +54 -0
- package/dist/server/utils/verify-jwt-with-jwks.mjs.map +1 -0
- package/jsconfig.json +7 -0
- package/package.json +28 -18
- package/rollup.config.mjs +2 -2
- package/server/{controllers → src/controllers}/auth.js +36 -29
- package/server/{controllers → src/controllers}/validation/auth.js +6 -6
- package/server/{controllers → src/controllers}/validation/email-template.js +1 -2
- package/server/{graphql → src/graphql}/mutations/auth/change-password.js +6 -6
- package/server/{graphql → src/graphql}/mutations/auth/email-confirmation.js +1 -1
- package/server/{graphql → src/graphql}/mutations/auth/forgot-password.js +6 -6
- package/server/{graphql → src/graphql}/mutations/auth/login.js +11 -7
- package/server/src/graphql/mutations/auth/rate-limit.js +62 -0
- package/server/{graphql → src/graphql}/mutations/auth/register.js +6 -6
- package/server/{graphql → src/graphql}/mutations/auth/reset-password.js +6 -6
- package/server/{graphql → src/graphql}/mutations/crud/role/create-role.js +1 -1
- package/server/{graphql → src/graphql}/mutations/crud/user/create-user.js +1 -1
- package/server/{graphql → src/graphql}/mutations/crud/user/update-user.js +1 -1
- package/server/{graphql → src/graphql}/utils.js +3 -3
- package/server/{middlewares → src/middlewares}/rateLimit.js +4 -4
- package/server/src/services/providers-registry.js +487 -0
- package/server/{services → src/services}/providers.js +9 -7
- package/server/{services → src/services}/role.js +2 -2
- package/server/{services → src/services}/user.js +16 -6
- package/server/{services → src/services}/users-permissions.js +14 -16
- package/server/{strategies → src/strategies}/users-permissions.js +14 -10
- package/server/src/utils/oauth-connect/index.js +262 -0
- package/server/src/utils/oauth-connect/oauth1.js +169 -0
- package/server/src/utils/oauth-connect/oauth2.js +123 -0
- package/server/src/utils/oauth-connect/providers.js +100 -0
- package/server/src/utils/provider-http.js +49 -0
- package/server/{utils → src/utils}/sanitize/sanitizers.js +1 -1
- package/server/src/utils/trim-grant-session-response.js +70 -0
- package/server/src/utils/verify-jwt-with-jwks.js +43 -0
- package/types/strapi-server.d.ts +65 -0
- package/server/services/providers-registry.js +0 -567
- package/server/utils/index.d.ts +0 -23
- /package/server/{bootstrap → src/bootstrap}/index.js +0 -0
- /package/server/{bootstrap → src/bootstrap}/users-permissions-actions.js +0 -0
- /package/server/{config.js → src/config.js} +0 -0
- /package/server/{content-types → src/content-types}/index.js +0 -0
- /package/server/{content-types → src/content-types}/permission/index.js +0 -0
- /package/server/{content-types → src/content-types}/role/index.js +0 -0
- /package/server/{content-types → src/content-types}/user/index.js +0 -0
- /package/server/{content-types → src/content-types}/user/schema-config.js +0 -0
- /package/server/{controllers → src/controllers}/content-manager-user.js +0 -0
- /package/server/{controllers → src/controllers}/index.js +0 -0
- /package/server/{controllers → src/controllers}/permissions.js +0 -0
- /package/server/{controllers → src/controllers}/role.js +0 -0
- /package/server/{controllers → src/controllers}/settings.js +0 -0
- /package/server/{controllers → src/controllers}/user.js +0 -0
- /package/server/{controllers → src/controllers}/validation/user.js +0 -0
- /package/server/{graphql → src/graphql}/index.js +0 -0
- /package/server/{graphql → src/graphql}/mutations/crud/role/delete-role.js +0 -0
- /package/server/{graphql → src/graphql}/mutations/crud/role/update-role.js +0 -0
- /package/server/{graphql → src/graphql}/mutations/crud/user/delete-user.js +0 -0
- /package/server/{graphql → src/graphql}/mutations/index.js +0 -0
- /package/server/{graphql → src/graphql}/queries/index.js +0 -0
- /package/server/{graphql → src/graphql}/queries/me.js +0 -0
- /package/server/{graphql → src/graphql}/resolvers-configs.js +0 -0
- /package/server/{graphql → src/graphql}/types/create-role-payload.js +0 -0
- /package/server/{graphql → src/graphql}/types/delete-role-payload.js +0 -0
- /package/server/{graphql → src/graphql}/types/index.js +0 -0
- /package/server/{graphql → src/graphql}/types/login-input.js +0 -0
- /package/server/{graphql → src/graphql}/types/login-payload.js +0 -0
- /package/server/{graphql → src/graphql}/types/me-role.js +0 -0
- /package/server/{graphql → src/graphql}/types/me.js +0 -0
- /package/server/{graphql → src/graphql}/types/password-payload.js +0 -0
- /package/server/{graphql → src/graphql}/types/register-input.js +0 -0
- /package/server/{graphql → src/graphql}/types/update-role-payload.js +0 -0
- /package/server/{graphql → src/graphql}/types/user-input.js +0 -0
- /package/server/{index.js → src/index.js} +0 -0
- /package/server/{middlewares → src/middlewares}/index.js +0 -0
- /package/server/{register.js → src/register.js} +0 -0
- /package/server/{routes → src/routes}/admin/index.js +0 -0
- /package/server/{routes → src/routes}/admin/permissions.js +0 -0
- /package/server/{routes → src/routes}/admin/role.js +0 -0
- /package/server/{routes → src/routes}/admin/settings.js +0 -0
- /package/server/{routes → src/routes}/content-api/auth.js +0 -0
- /package/server/{routes → src/routes}/content-api/index.js +0 -0
- /package/server/{routes → src/routes}/content-api/permissions.js +0 -0
- /package/server/{routes → src/routes}/content-api/role.js +0 -0
- /package/server/{routes → src/routes}/content-api/user.js +0 -0
- /package/server/{routes → src/routes}/content-api/validation.js +0 -0
- /package/server/{routes → src/routes}/index.js +0 -0
- /package/server/{services → src/services}/constants.js +0 -0
- /package/server/{services → src/services}/index.js +0 -0
- /package/server/{services → src/services}/jwt.js +0 -0
- /package/server/{services → src/services}/permission.js +0 -0
- /package/server/{utils → src/utils}/index.js +0 -0
- /package/server/{utils → src/utils}/refresh-cookie-options.js +0 -0
- /package/server/{utils → src/utils}/sanitize/index.js +0 -0
- /package/server/{utils → src/utils}/sanitize/visitors/index.js +0 -0
- /package/server/{utils → src/utils}/sanitize/visitors/remove-user-relation-from-role-entities.js +0 -0
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import require$$1 from '@strapi/utils';
|
|
2
|
+
import { __require as requireProviders } from './providers.mjs';
|
|
3
|
+
import { __require as requireOauth1 } from './oauth1.mjs';
|
|
4
|
+
import { __require as requireOauth2 } from './oauth2.mjs';
|
|
5
|
+
import { __require as requireTrimGrantSessionResponse } from '../trim-grant-session-response.mjs';
|
|
6
|
+
import { __require as requireUtils } from '../index.mjs';
|
|
7
|
+
|
|
8
|
+
var oauthConnect;
|
|
9
|
+
var hasRequiredOauthConnect;
|
|
10
|
+
function requireOauthConnect() {
|
|
11
|
+
if (hasRequiredOauthConnect) return oauthConnect;
|
|
12
|
+
hasRequiredOauthConnect = 1;
|
|
13
|
+
const { errors } = require$$1;
|
|
14
|
+
const builtinProviderEndpoints = requireProviders();
|
|
15
|
+
const oauth1 = requireOauth1();
|
|
16
|
+
const oauth2 = requireOauth2();
|
|
17
|
+
const { trimGrantSessionResponse } = requireTrimGrantSessionResponse();
|
|
18
|
+
const CONNECT_PREFIX = '/connect';
|
|
19
|
+
const parseConnectPath = (requestPath, apiPrefix)=>{
|
|
20
|
+
const prefix = `${apiPrefix}${CONNECT_PREFIX}/`;
|
|
21
|
+
if (!requestPath.startsWith(prefix)) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
const remainder = requestPath.slice(prefix.length);
|
|
25
|
+
const [provider, segment] = remainder.split('/').filter(Boolean);
|
|
26
|
+
if (!provider) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
provider,
|
|
31
|
+
isCallback: segment === 'callback'
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Resolve OAuth endpoint config from built-ins, falling back to store-defined
|
|
36
|
+
* endpoints so custom providers registered via providers-registry still work.
|
|
37
|
+
*/ const buildProviderConfig = (providerName, storedConfig, redirectUri)=>{
|
|
38
|
+
const defaults = builtinProviderEndpoints[providerName];
|
|
39
|
+
const endpoints = defaults || {
|
|
40
|
+
oauth: storedConfig.oauth,
|
|
41
|
+
authorize_url: storedConfig.authorize_url,
|
|
42
|
+
access_url: storedConfig.access_url,
|
|
43
|
+
request_url: storedConfig.request_url,
|
|
44
|
+
scope_delimiter: storedConfig.scope_delimiter,
|
|
45
|
+
token_endpoint_auth_method: storedConfig.token_endpoint_auth_method
|
|
46
|
+
};
|
|
47
|
+
if (endpoints.oauth === 1) {
|
|
48
|
+
if (!endpoints.request_url || !endpoints.authorize_url || !endpoints.access_url) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
} else if (!endpoints.authorize_url || !endpoints.access_url) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
name: providerName,
|
|
56
|
+
...endpoints,
|
|
57
|
+
key: storedConfig.key,
|
|
58
|
+
secret: storedConfig.secret,
|
|
59
|
+
scope: storedConfig.scope,
|
|
60
|
+
subdomain: storedConfig.subdomain,
|
|
61
|
+
callback: storedConfig.callback,
|
|
62
|
+
redirect_uri: redirectUri
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
const redirectWithPayload = (ctx, callbackUrl, payload)=>{
|
|
66
|
+
const url = new URL(callbackUrl);
|
|
67
|
+
const params = new URLSearchParams();
|
|
68
|
+
Object.entries(payload).forEach(([key, value])=>{
|
|
69
|
+
if (key === 'raw') {
|
|
70
|
+
Object.entries(value).forEach(([rawKey, rawValue])=>{
|
|
71
|
+
params.set(`raw[${rawKey}]`, String(rawValue));
|
|
72
|
+
});
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (value !== undefined && value !== null) {
|
|
76
|
+
params.set(key, String(value));
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
url.search = params.toString();
|
|
80
|
+
ctx.redirect(url.toString());
|
|
81
|
+
};
|
|
82
|
+
const preserveGrantDynamic = (ctx)=>{
|
|
83
|
+
const dynamic = ctx.session.grant?.dynamic;
|
|
84
|
+
return dynamic ? {
|
|
85
|
+
dynamic
|
|
86
|
+
} : {};
|
|
87
|
+
};
|
|
88
|
+
const redirectWithSessionResponse = (ctx, callbackUrl, provider, tokenResponse)=>{
|
|
89
|
+
const grantResponse = oauth2.tokensToQueryPayload(provider, tokenResponse);
|
|
90
|
+
ctx.session.grant = {
|
|
91
|
+
response: trimGrantSessionResponse(grantResponse, provider.name)
|
|
92
|
+
};
|
|
93
|
+
return redirectWithPayload(ctx, callbackUrl, {});
|
|
94
|
+
};
|
|
95
|
+
const startOAuth1Flow = async (ctx, provider, parsed, redirectUri)=>{
|
|
96
|
+
const requestToken = await oauth1.requestToken({
|
|
97
|
+
requestUrl: provider.request_url,
|
|
98
|
+
redirectUri,
|
|
99
|
+
consumerKey: provider.key,
|
|
100
|
+
clientCredential: provider.secret
|
|
101
|
+
});
|
|
102
|
+
ctx.session.grant = {
|
|
103
|
+
...preserveGrantDynamic(ctx),
|
|
104
|
+
provider: parsed.provider,
|
|
105
|
+
request: requestToken
|
|
106
|
+
};
|
|
107
|
+
const authorizeUrl = `${provider.authorize_url}?oauth_token=${encodeURIComponent(requestToken.oauth_token)}`;
|
|
108
|
+
return ctx.redirect(authorizeUrl);
|
|
109
|
+
};
|
|
110
|
+
const startOAuth2Flow = (ctx, provider, parsed, redirectUri)=>{
|
|
111
|
+
const state = oauth2.generateState();
|
|
112
|
+
ctx.session.grant = {
|
|
113
|
+
...preserveGrantDynamic(ctx),
|
|
114
|
+
provider: parsed.provider,
|
|
115
|
+
state
|
|
116
|
+
};
|
|
117
|
+
let authorizeUrl = oauth2.buildAuthorizeUrl(provider, {
|
|
118
|
+
key: provider.key,
|
|
119
|
+
redirectUri,
|
|
120
|
+
scope: provider.scope,
|
|
121
|
+
subdomain: provider.subdomain
|
|
122
|
+
});
|
|
123
|
+
authorizeUrl += `&state=${encodeURIComponent(state)}`;
|
|
124
|
+
return ctx.redirect(authorizeUrl);
|
|
125
|
+
};
|
|
126
|
+
const handleOAuth1Callback = async (ctx, provider, callbackUrl)=>{
|
|
127
|
+
const session = ctx.session.grant || {};
|
|
128
|
+
const { oauth_token: oauthToken, oauth_verifier: oauthVerifier } = ctx.query;
|
|
129
|
+
const requestToken = session.request;
|
|
130
|
+
if (!requestToken?.oauth_token || oauthToken !== requestToken.oauth_token) {
|
|
131
|
+
throw new Error('OAuth1 token mismatch');
|
|
132
|
+
}
|
|
133
|
+
const tokenResponse = await oauth1.accessToken({
|
|
134
|
+
accessUrl: provider.access_url,
|
|
135
|
+
consumerKey: provider.key,
|
|
136
|
+
clientCredential: provider.secret,
|
|
137
|
+
oauthToken,
|
|
138
|
+
oauthVerifier,
|
|
139
|
+
oauthTokenCredential: requestToken.oauth_token_secret
|
|
140
|
+
});
|
|
141
|
+
return redirectWithSessionResponse(ctx, callbackUrl, provider, tokenResponse);
|
|
142
|
+
};
|
|
143
|
+
const handleOAuth2Callback = async (ctx, provider, callbackUrl, redirectUri)=>{
|
|
144
|
+
const session = ctx.session.grant || {};
|
|
145
|
+
const { code, state: queryState, error, error_description: errorDescription } = ctx.query;
|
|
146
|
+
if (error) {
|
|
147
|
+
ctx.session.grant = {};
|
|
148
|
+
return redirectWithPayload(ctx, callbackUrl, {
|
|
149
|
+
error,
|
|
150
|
+
error_description: errorDescription
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
if (!code) {
|
|
154
|
+
throw new Error('OAuth2 missing code parameter');
|
|
155
|
+
}
|
|
156
|
+
// Reject when session state is missing (not only on mismatch) to close login-CSRF.
|
|
157
|
+
if (!session.state || queryState !== session.state) {
|
|
158
|
+
throw new Error('OAuth2 state mismatch');
|
|
159
|
+
}
|
|
160
|
+
const tokenResponse = await oauth2.exchangeAuthorizationCode(provider, {
|
|
161
|
+
key: provider.key,
|
|
162
|
+
secret: provider.secret,
|
|
163
|
+
redirectUri,
|
|
164
|
+
code,
|
|
165
|
+
subdomain: provider.subdomain
|
|
166
|
+
});
|
|
167
|
+
return redirectWithSessionResponse(ctx, callbackUrl, provider, tokenResponse);
|
|
168
|
+
};
|
|
169
|
+
const createOAuthConnectMiddleware = ()=>{
|
|
170
|
+
return async (ctx, next)=>{
|
|
171
|
+
const apiPrefix = strapi.config.get('api.rest.prefix');
|
|
172
|
+
const [requestPath] = ctx.request.url.split('?');
|
|
173
|
+
const parsed = parseConnectPath(requestPath, apiPrefix);
|
|
174
|
+
if (!parsed) {
|
|
175
|
+
return next();
|
|
176
|
+
}
|
|
177
|
+
if (!ctx.session) {
|
|
178
|
+
ctx.throw(400, 'OAuth connect requires session middleware');
|
|
179
|
+
}
|
|
180
|
+
const storedProviders = await strapi.store({
|
|
181
|
+
type: 'plugin',
|
|
182
|
+
name: 'users-permissions',
|
|
183
|
+
key: 'grant'
|
|
184
|
+
}).get();
|
|
185
|
+
const storedConfig = storedProviders?.[parsed.provider];
|
|
186
|
+
if (!storedConfig?.enabled) {
|
|
187
|
+
throw new errors.ApplicationError('This provider is disabled');
|
|
188
|
+
}
|
|
189
|
+
const { getService } = requireUtils();
|
|
190
|
+
const redirectUri = getService('providers').buildRedirectUri(parsed.provider);
|
|
191
|
+
const callbackOverride = ctx.state.oauthConnect?.callback ?? ctx.session.grant?.dynamic?.callback;
|
|
192
|
+
const effectiveConfig = callbackOverride ? {
|
|
193
|
+
...storedConfig,
|
|
194
|
+
callback: callbackOverride
|
|
195
|
+
} : storedConfig;
|
|
196
|
+
const provider = buildProviderConfig(parsed.provider, effectiveConfig, redirectUri);
|
|
197
|
+
if (!provider) {
|
|
198
|
+
throw new errors.ApplicationError('Unknown OAuth provider');
|
|
199
|
+
}
|
|
200
|
+
ctx.session.grant = ctx.session.grant || {};
|
|
201
|
+
if (!parsed.isCallback) {
|
|
202
|
+
if (provider.oauth === 1) {
|
|
203
|
+
return startOAuth1Flow(ctx, provider, parsed, redirectUri);
|
|
204
|
+
}
|
|
205
|
+
return startOAuth2Flow(ctx, provider, parsed, redirectUri);
|
|
206
|
+
}
|
|
207
|
+
const callbackUrl = effectiveConfig.callback;
|
|
208
|
+
if (!callbackUrl) {
|
|
209
|
+
throw new errors.ApplicationError('Provider callback URL is not configured');
|
|
210
|
+
}
|
|
211
|
+
try {
|
|
212
|
+
if (provider.oauth === 1) {
|
|
213
|
+
return await handleOAuth1Callback(ctx, provider, callbackUrl);
|
|
214
|
+
}
|
|
215
|
+
return await handleOAuth2Callback(ctx, provider, callbackUrl, redirectUri);
|
|
216
|
+
} catch (err) {
|
|
217
|
+
ctx.session.grant = {};
|
|
218
|
+
return redirectWithPayload(ctx, callbackUrl, {
|
|
219
|
+
error: 'oauth_error',
|
|
220
|
+
error_description: err.message
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
};
|
|
225
|
+
oauthConnect = {
|
|
226
|
+
createOAuthConnectMiddleware,
|
|
227
|
+
parseConnectPath,
|
|
228
|
+
buildProviderConfig,
|
|
229
|
+
redirectWithPayload
|
|
230
|
+
};
|
|
231
|
+
return oauthConnect;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
export { requireOauthConnect as __require };
|
|
235
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../server/src/utils/oauth-connect/index.js"],"sourcesContent":["'use strict';\n\nconst { errors } = require('@strapi/utils');\n\nconst builtinProviderEndpoints = require('./providers');\nconst oauth1 = require('./oauth1');\nconst oauth2 = require('./oauth2');\nconst { trimGrantSessionResponse } = require('../trim-grant-session-response');\n\nconst CONNECT_PREFIX = '/connect';\n\nconst parseConnectPath = (requestPath, apiPrefix) => {\n const prefix = `${apiPrefix}${CONNECT_PREFIX}/`;\n if (!requestPath.startsWith(prefix)) {\n return null;\n }\n\n const remainder = requestPath.slice(prefix.length);\n const [provider, segment] = remainder.split('/').filter(Boolean);\n\n if (!provider) {\n return null;\n }\n\n return {\n provider,\n isCallback: segment === 'callback',\n };\n};\n\n/**\n * Resolve OAuth endpoint config from built-ins, falling back to store-defined\n * endpoints so custom providers registered via providers-registry still work.\n */\nconst buildProviderConfig = (providerName, storedConfig, redirectUri) => {\n const defaults = builtinProviderEndpoints[providerName];\n const endpoints = defaults || {\n oauth: storedConfig.oauth,\n authorize_url: storedConfig.authorize_url,\n access_url: storedConfig.access_url,\n request_url: storedConfig.request_url,\n scope_delimiter: storedConfig.scope_delimiter,\n token_endpoint_auth_method: storedConfig.token_endpoint_auth_method,\n };\n\n if (endpoints.oauth === 1) {\n if (!endpoints.request_url || !endpoints.authorize_url || !endpoints.access_url) {\n return null;\n }\n } else if (!endpoints.authorize_url || !endpoints.access_url) {\n return null;\n }\n\n return {\n name: providerName,\n ...endpoints,\n key: storedConfig.key,\n secret: storedConfig.secret,\n scope: storedConfig.scope,\n subdomain: storedConfig.subdomain,\n callback: storedConfig.callback,\n redirect_uri: redirectUri,\n };\n};\n\nconst redirectWithPayload = (ctx, callbackUrl, payload) => {\n const url = new URL(callbackUrl);\n const params = new URLSearchParams();\n\n Object.entries(payload).forEach(([key, value]) => {\n if (key === 'raw') {\n Object.entries(value).forEach(([rawKey, rawValue]) => {\n params.set(`raw[${rawKey}]`, String(rawValue));\n });\n return;\n }\n if (value !== undefined && value !== null) {\n params.set(key, String(value));\n }\n });\n\n url.search = params.toString();\n ctx.redirect(url.toString());\n};\n\nconst preserveGrantDynamic = (ctx) => {\n const dynamic = ctx.session.grant?.dynamic;\n return dynamic ? { dynamic } : {};\n};\n\nconst redirectWithSessionResponse = (ctx, callbackUrl, provider, tokenResponse) => {\n const grantResponse = oauth2.tokensToQueryPayload(provider, tokenResponse);\n ctx.session.grant = {\n response: trimGrantSessionResponse(grantResponse, provider.name),\n };\n\n return redirectWithPayload(ctx, callbackUrl, {});\n};\n\nconst startOAuth1Flow = async (ctx, provider, parsed, redirectUri) => {\n const requestToken = await oauth1.requestToken({\n requestUrl: provider.request_url,\n redirectUri,\n consumerKey: provider.key,\n clientCredential: provider.secret,\n });\n\n ctx.session.grant = {\n ...preserveGrantDynamic(ctx),\n provider: parsed.provider,\n request: requestToken,\n };\n\n const authorizeUrl = `${provider.authorize_url}?oauth_token=${encodeURIComponent(requestToken.oauth_token)}`;\n return ctx.redirect(authorizeUrl);\n};\n\nconst startOAuth2Flow = (ctx, provider, parsed, redirectUri) => {\n const state = oauth2.generateState();\n ctx.session.grant = {\n ...preserveGrantDynamic(ctx),\n provider: parsed.provider,\n state,\n };\n\n let authorizeUrl = oauth2.buildAuthorizeUrl(provider, {\n key: provider.key,\n redirectUri,\n scope: provider.scope,\n subdomain: provider.subdomain,\n });\n\n authorizeUrl += `&state=${encodeURIComponent(state)}`;\n return ctx.redirect(authorizeUrl);\n};\n\nconst handleOAuth1Callback = async (ctx, provider, callbackUrl) => {\n const session = ctx.session.grant || {};\n const { oauth_token: oauthToken, oauth_verifier: oauthVerifier } = ctx.query;\n const requestToken = session.request;\n\n if (!requestToken?.oauth_token || oauthToken !== requestToken.oauth_token) {\n throw new Error('OAuth1 token mismatch');\n }\n\n const tokenResponse = await oauth1.accessToken({\n accessUrl: provider.access_url,\n consumerKey: provider.key,\n clientCredential: provider.secret,\n oauthToken,\n oauthVerifier,\n oauthTokenCredential: requestToken.oauth_token_secret,\n });\n\n return redirectWithSessionResponse(ctx, callbackUrl, provider, tokenResponse);\n};\n\nconst handleOAuth2Callback = async (ctx, provider, callbackUrl, redirectUri) => {\n const session = ctx.session.grant || {};\n const { code, state: queryState, error, error_description: errorDescription } = ctx.query;\n\n if (error) {\n ctx.session.grant = {};\n return redirectWithPayload(ctx, callbackUrl, {\n error,\n error_description: errorDescription,\n });\n }\n\n if (!code) {\n throw new Error('OAuth2 missing code parameter');\n }\n\n // Reject when session state is missing (not only on mismatch) to close login-CSRF.\n if (!session.state || queryState !== session.state) {\n throw new Error('OAuth2 state mismatch');\n }\n\n const tokenResponse = await oauth2.exchangeAuthorizationCode(provider, {\n key: provider.key,\n secret: provider.secret,\n redirectUri,\n code,\n subdomain: provider.subdomain,\n });\n\n return redirectWithSessionResponse(ctx, callbackUrl, provider, tokenResponse);\n};\n\nconst createOAuthConnectMiddleware = () => {\n return async (ctx, next) => {\n const apiPrefix = strapi.config.get('api.rest.prefix');\n const [requestPath] = ctx.request.url.split('?');\n const parsed = parseConnectPath(requestPath, apiPrefix);\n\n if (!parsed) {\n return next();\n }\n\n if (!ctx.session) {\n ctx.throw(400, 'OAuth connect requires session middleware');\n }\n\n const storedProviders = await strapi\n .store({ type: 'plugin', name: 'users-permissions', key: 'grant' })\n .get();\n\n const storedConfig = storedProviders?.[parsed.provider];\n if (!storedConfig?.enabled) {\n throw new errors.ApplicationError('This provider is disabled');\n }\n\n const { getService } = require('..');\n const redirectUri = getService('providers').buildRedirectUri(parsed.provider);\n\n const callbackOverride =\n ctx.state.oauthConnect?.callback ?? ctx.session.grant?.dynamic?.callback;\n const effectiveConfig = callbackOverride\n ? { ...storedConfig, callback: callbackOverride }\n : storedConfig;\n\n const provider = buildProviderConfig(parsed.provider, effectiveConfig, redirectUri);\n\n if (!provider) {\n throw new errors.ApplicationError('Unknown OAuth provider');\n }\n\n ctx.session.grant = ctx.session.grant || {};\n\n if (!parsed.isCallback) {\n if (provider.oauth === 1) {\n return startOAuth1Flow(ctx, provider, parsed, redirectUri);\n }\n return startOAuth2Flow(ctx, provider, parsed, redirectUri);\n }\n\n const callbackUrl = effectiveConfig.callback;\n if (!callbackUrl) {\n throw new errors.ApplicationError('Provider callback URL is not configured');\n }\n\n try {\n if (provider.oauth === 1) {\n return await handleOAuth1Callback(ctx, provider, callbackUrl);\n }\n return await handleOAuth2Callback(ctx, provider, callbackUrl, redirectUri);\n } catch (err) {\n ctx.session.grant = {};\n return redirectWithPayload(ctx, callbackUrl, {\n error: 'oauth_error',\n error_description: err.message,\n });\n }\n };\n};\n\nmodule.exports = {\n createOAuthConnectMiddleware,\n parseConnectPath,\n buildProviderConfig,\n redirectWithPayload,\n};\n"],"names":["errors","require$$0","builtinProviderEndpoints","require$$1","oauth1","require$$2","oauth2","require$$3","trimGrantSessionResponse","require$$4","CONNECT_PREFIX","parseConnectPath","requestPath","apiPrefix","prefix","startsWith","remainder","slice","length","provider","segment","split","filter","Boolean","isCallback","buildProviderConfig","providerName","storedConfig","redirectUri","defaults","endpoints","oauth","authorize_url","access_url","request_url","scope_delimiter","token_endpoint_auth_method","name","key","secret","scope","subdomain","callback","redirect_uri","redirectWithPayload","ctx","callbackUrl","payload","url","URL","params","URLSearchParams","Object","entries","forEach","value","rawKey","rawValue","set","String","undefined","search","toString","redirect","preserveGrantDynamic","dynamic","session","grant","redirectWithSessionResponse","tokenResponse","grantResponse","tokensToQueryPayload","response","startOAuth1Flow","parsed","requestToken","requestUrl","consumerKey","clientCredential","request","authorizeUrl","encodeURIComponent","oauth_token","startOAuth2Flow","state","generateState","buildAuthorizeUrl","handleOAuth1Callback","oauthToken","oauth_verifier","oauthVerifier","query","Error","accessToken","accessUrl","oauthTokenCredential","oauth_token_secret","handleOAuth2Callback","code","queryState","error","error_description","errorDescription","exchangeAuthorizationCode","createOAuthConnectMiddleware","next","strapi","config","get","throw","storedProviders","store","type","enabled","ApplicationError","getService","require$$5","buildRedirectUri","callbackOverride","oauthConnect","effectiveConfig","err","message"],"mappings":"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"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var _node_crypto_commonjsExternal = require('../../_virtual/_node_crypto.js');
|
|
4
|
+
var _node_url_commonjsExternal = require('../../_virtual/_node_url.js');
|
|
5
|
+
|
|
6
|
+
var oauth1;
|
|
7
|
+
var hasRequiredOauth1;
|
|
8
|
+
function requireOauth1() {
|
|
9
|
+
if (hasRequiredOauth1) return oauth1;
|
|
10
|
+
hasRequiredOauth1 = 1;
|
|
11
|
+
const crypto = _node_crypto_commonjsExternal.__require();
|
|
12
|
+
const { URLSearchParams } = _node_url_commonjsExternal.__require();
|
|
13
|
+
const encode = (str)=>encodeURIComponent(str).replace(/[!'()*]/g, (c)=>`%${c.codePointAt(0).toString(16).toUpperCase()}`);
|
|
14
|
+
const sortKeys = (keys)=>keys.sort((a, b)=>{
|
|
15
|
+
if (a < b) return -1;
|
|
16
|
+
if (a > b) return 1;
|
|
17
|
+
return 0;
|
|
18
|
+
});
|
|
19
|
+
/**
|
|
20
|
+
* OAuth 1.0 (RFC 5849) request signature — HMAC-SHA1 is required by the protocol.
|
|
21
|
+
* This is not password storage or user-credential hashing (those use bcrypt).
|
|
22
|
+
*/ const signRfc5849BaseString = (signatureBaseString, signingMaterial)=>{
|
|
23
|
+
// codeql[js/insufficient-password-hash] OAuth 1.0 signing material, not user password storage
|
|
24
|
+
return crypto.createHmac('sha1', signingMaterial).update(signatureBaseString).digest('base64');
|
|
25
|
+
};
|
|
26
|
+
const buildOAuth1Header = ({ method, url, params, consumerKey, clientCredential, token, tokenCredential })=>{
|
|
27
|
+
const requestParameters = {
|
|
28
|
+
oauth_consumer_key: consumerKey,
|
|
29
|
+
oauth_nonce: crypto.randomBytes(16).toString('hex'),
|
|
30
|
+
oauth_signature_method: 'HMAC-SHA1',
|
|
31
|
+
oauth_timestamp: Math.floor(Date.now() / 1000).toString(),
|
|
32
|
+
oauth_version: '1.0',
|
|
33
|
+
...token ? {
|
|
34
|
+
oauth_token: token
|
|
35
|
+
} : {},
|
|
36
|
+
...params
|
|
37
|
+
};
|
|
38
|
+
const paramString = sortKeys(Object.keys(requestParameters)).map((key)=>`${encode(key)}=${encode(requestParameters[key])}`).join('&');
|
|
39
|
+
const signatureBaseString = [
|
|
40
|
+
method.toUpperCase(),
|
|
41
|
+
encode(url),
|
|
42
|
+
encode(paramString)
|
|
43
|
+
].join('&');
|
|
44
|
+
const signingMaterial = `${encode(clientCredential)}&${encode(tokenCredential || '')}`;
|
|
45
|
+
const signature = signRfc5849BaseString(signatureBaseString, signingMaterial);
|
|
46
|
+
const headerParameters = {
|
|
47
|
+
...requestParameters,
|
|
48
|
+
oauth_signature: signature
|
|
49
|
+
};
|
|
50
|
+
const header = `OAuth ${sortKeys(Object.keys(headerParameters)).map((key)=>`${encode(key)}="${encode(headerParameters[key])}"`).join(', ')}`;
|
|
51
|
+
return header;
|
|
52
|
+
};
|
|
53
|
+
const oauth1Request = async ({ method, url, consumerKey, clientCredential, token, tokenCredential, params = {} })=>{
|
|
54
|
+
const authorization = buildOAuth1Header({
|
|
55
|
+
method,
|
|
56
|
+
url,
|
|
57
|
+
params,
|
|
58
|
+
consumerKey,
|
|
59
|
+
clientCredential,
|
|
60
|
+
token,
|
|
61
|
+
tokenCredential
|
|
62
|
+
});
|
|
63
|
+
const response = await fetch(url, {
|
|
64
|
+
method,
|
|
65
|
+
headers: {
|
|
66
|
+
Authorization: authorization
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
const text = await response.text();
|
|
70
|
+
if (!response.ok) {
|
|
71
|
+
throw new Error(text || `OAuth1 request failed (${response.status})`);
|
|
72
|
+
}
|
|
73
|
+
return Object.fromEntries(new URLSearchParams(text));
|
|
74
|
+
};
|
|
75
|
+
const requestToken = async ({ requestUrl, redirectUri, consumerKey, clientCredential })=>oauth1Request({
|
|
76
|
+
method: 'POST',
|
|
77
|
+
url: requestUrl,
|
|
78
|
+
consumerKey,
|
|
79
|
+
clientCredential,
|
|
80
|
+
params: {
|
|
81
|
+
oauth_callback: redirectUri
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
const accessToken = async ({ accessUrl, consumerKey, clientCredential, oauthToken, oauthVerifier, oauthTokenCredential })=>oauth1Request({
|
|
85
|
+
method: 'POST',
|
|
86
|
+
url: accessUrl,
|
|
87
|
+
consumerKey,
|
|
88
|
+
clientCredential,
|
|
89
|
+
token: oauthToken,
|
|
90
|
+
tokenCredential: oauthTokenCredential,
|
|
91
|
+
params: {
|
|
92
|
+
oauth_verifier: oauthVerifier
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
const twitterGet = async ({ url, accessToken, accessCredential, consumerKey, clientCredential, qs = {} })=>{
|
|
96
|
+
const target = new URL(url);
|
|
97
|
+
const signedParams = {};
|
|
98
|
+
Object.entries(qs).forEach(([key, value])=>{
|
|
99
|
+
if (value !== undefined && value !== null) {
|
|
100
|
+
const stringValue = String(value);
|
|
101
|
+
target.searchParams.set(key, stringValue);
|
|
102
|
+
// RFC 5849 §3.4.1: base-string URI excludes the query; params are signed separately.
|
|
103
|
+
signedParams[key] = stringValue;
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
const authorization = buildOAuth1Header({
|
|
107
|
+
method: 'GET',
|
|
108
|
+
url: target.origin + target.pathname,
|
|
109
|
+
params: signedParams,
|
|
110
|
+
consumerKey,
|
|
111
|
+
clientCredential,
|
|
112
|
+
token: accessToken,
|
|
113
|
+
tokenCredential: accessCredential
|
|
114
|
+
});
|
|
115
|
+
const response = await fetch(target, {
|
|
116
|
+
headers: {
|
|
117
|
+
Authorization: authorization
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
const body = await response.json();
|
|
121
|
+
if (!response.ok) {
|
|
122
|
+
throw new Error(body.errors?.[0]?.message || `Twitter API error (${response.status})`);
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
body
|
|
126
|
+
};
|
|
127
|
+
};
|
|
128
|
+
oauth1 = {
|
|
129
|
+
buildOAuth1Header,
|
|
130
|
+
requestToken,
|
|
131
|
+
accessToken,
|
|
132
|
+
twitterGet
|
|
133
|
+
};
|
|
134
|
+
return oauth1;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
exports.__require = requireOauth1;
|
|
138
|
+
//# sourceMappingURL=oauth1.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth1.js","sources":["../../../../server/src/utils/oauth-connect/oauth1.js"],"sourcesContent":["'use strict';\n\nconst crypto = require('node:crypto');\nconst { URLSearchParams } = require('node:url');\n\nconst encode = (str) =>\n encodeURIComponent(str).replace(\n /[!'()*]/g,\n (c) => `%${c.codePointAt(0).toString(16).toUpperCase()}`\n );\n\nconst sortKeys = (keys) =>\n keys.sort((a, b) => {\n if (a < b) return -1;\n if (a > b) return 1;\n return 0;\n });\n\n/**\n * OAuth 1.0 (RFC 5849) request signature — HMAC-SHA1 is required by the protocol.\n * This is not password storage or user-credential hashing (those use bcrypt).\n */\nconst signRfc5849BaseString = (signatureBaseString, signingMaterial) => {\n // codeql[js/insufficient-password-hash] OAuth 1.0 signing material, not user password storage\n return crypto.createHmac('sha1', signingMaterial).update(signatureBaseString).digest('base64');\n};\n\nconst buildOAuth1Header = ({\n method,\n url,\n params,\n consumerKey,\n clientCredential,\n token,\n tokenCredential,\n}) => {\n const requestParameters = {\n oauth_consumer_key: consumerKey,\n oauth_nonce: crypto.randomBytes(16).toString('hex'),\n oauth_signature_method: 'HMAC-SHA1',\n oauth_timestamp: Math.floor(Date.now() / 1000).toString(),\n oauth_version: '1.0',\n ...(token ? { oauth_token: token } : {}),\n ...params,\n };\n\n const paramString = sortKeys(Object.keys(requestParameters))\n .map((key) => `${encode(key)}=${encode(requestParameters[key])}`)\n .join('&');\n\n const signatureBaseString = [method.toUpperCase(), encode(url), encode(paramString)].join('&');\n const signingMaterial = `${encode(clientCredential)}&${encode(tokenCredential || '')}`;\n const signature = signRfc5849BaseString(signatureBaseString, signingMaterial);\n\n const headerParameters = { ...requestParameters, oauth_signature: signature };\n const header = `OAuth ${sortKeys(Object.keys(headerParameters))\n .map((key) => `${encode(key)}=\"${encode(headerParameters[key])}\"`)\n .join(', ')}`;\n\n return header;\n};\n\nconst oauth1Request = async ({\n method,\n url,\n consumerKey,\n clientCredential,\n token,\n tokenCredential,\n params = {},\n}) => {\n const authorization = buildOAuth1Header({\n method,\n url,\n params,\n consumerKey,\n clientCredential,\n token,\n tokenCredential,\n });\n\n const response = await fetch(url, {\n method,\n headers: { Authorization: authorization },\n });\n\n const text = await response.text();\n if (!response.ok) {\n throw new Error(text || `OAuth1 request failed (${response.status})`);\n }\n\n return Object.fromEntries(new URLSearchParams(text));\n};\n\nconst requestToken = async ({ requestUrl, redirectUri, consumerKey, clientCredential }) =>\n oauth1Request({\n method: 'POST',\n url: requestUrl,\n consumerKey,\n clientCredential,\n params: { oauth_callback: redirectUri },\n });\n\nconst accessToken = async ({\n accessUrl,\n consumerKey,\n clientCredential,\n oauthToken,\n oauthVerifier,\n oauthTokenCredential,\n}) =>\n oauth1Request({\n method: 'POST',\n url: accessUrl,\n consumerKey,\n clientCredential,\n token: oauthToken,\n tokenCredential: oauthTokenCredential,\n params: { oauth_verifier: oauthVerifier },\n });\n\nconst twitterGet = async ({\n url,\n accessToken,\n accessCredential,\n consumerKey,\n clientCredential,\n qs = {},\n}) => {\n const target = new URL(url);\n const signedParams = {};\n\n Object.entries(qs).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n const stringValue = String(value);\n target.searchParams.set(key, stringValue);\n // RFC 5849 §3.4.1: base-string URI excludes the query; params are signed separately.\n signedParams[key] = stringValue;\n }\n });\n\n const authorization = buildOAuth1Header({\n method: 'GET',\n url: target.origin + target.pathname,\n params: signedParams,\n consumerKey,\n clientCredential,\n token: accessToken,\n tokenCredential: accessCredential,\n });\n\n const response = await fetch(target, {\n headers: { Authorization: authorization },\n });\n\n const body = await response.json();\n if (!response.ok) {\n throw new Error(body.errors?.[0]?.message || `Twitter API error (${response.status})`);\n }\n\n return { body };\n};\n\nmodule.exports = {\n buildOAuth1Header,\n requestToken,\n accessToken,\n twitterGet,\n};\n"],"names":["crypto","require$$0","URLSearchParams","require$$1","encode","str","encodeURIComponent","replace","c","codePointAt","toString","toUpperCase","sortKeys","keys","sort","a","b","signRfc5849BaseString","signatureBaseString","signingMaterial","createHmac","update","digest","buildOAuth1Header","method","url","params","consumerKey","clientCredential","token","tokenCredential","requestParameters","oauth_consumer_key","oauth_nonce","randomBytes","oauth_signature_method","oauth_timestamp","Math","floor","Date","now","oauth_version","oauth_token","paramString","Object","map","key","join","signature","headerParameters","oauth_signature","header","oauth1Request","authorization","response","fetch","headers","Authorization","text","ok","Error","status","fromEntries","requestToken","requestUrl","redirectUri","oauth_callback","accessToken","accessUrl","oauthToken","oauthVerifier","oauthTokenCredential","oauth_verifier","twitterGet","accessCredential","qs","target","URL","signedParams","entries","forEach","value","undefined","stringValue","String","searchParams","set","origin","pathname","body","json","errors","message","oauth1"],"mappings":"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"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { __require } from '../../_virtual/_node_crypto.mjs';
|
|
2
|
+
import { __require as __require$1 } from '../../_virtual/_node_url.mjs';
|
|
3
|
+
|
|
4
|
+
var oauth1;
|
|
5
|
+
var hasRequiredOauth1;
|
|
6
|
+
function requireOauth1() {
|
|
7
|
+
if (hasRequiredOauth1) return oauth1;
|
|
8
|
+
hasRequiredOauth1 = 1;
|
|
9
|
+
const crypto = __require();
|
|
10
|
+
const { URLSearchParams } = __require$1();
|
|
11
|
+
const encode = (str)=>encodeURIComponent(str).replace(/[!'()*]/g, (c)=>`%${c.codePointAt(0).toString(16).toUpperCase()}`);
|
|
12
|
+
const sortKeys = (keys)=>keys.sort((a, b)=>{
|
|
13
|
+
if (a < b) return -1;
|
|
14
|
+
if (a > b) return 1;
|
|
15
|
+
return 0;
|
|
16
|
+
});
|
|
17
|
+
/**
|
|
18
|
+
* OAuth 1.0 (RFC 5849) request signature — HMAC-SHA1 is required by the protocol.
|
|
19
|
+
* This is not password storage or user-credential hashing (those use bcrypt).
|
|
20
|
+
*/ const signRfc5849BaseString = (signatureBaseString, signingMaterial)=>{
|
|
21
|
+
// codeql[js/insufficient-password-hash] OAuth 1.0 signing material, not user password storage
|
|
22
|
+
return crypto.createHmac('sha1', signingMaterial).update(signatureBaseString).digest('base64');
|
|
23
|
+
};
|
|
24
|
+
const buildOAuth1Header = ({ method, url, params, consumerKey, clientCredential, token, tokenCredential })=>{
|
|
25
|
+
const requestParameters = {
|
|
26
|
+
oauth_consumer_key: consumerKey,
|
|
27
|
+
oauth_nonce: crypto.randomBytes(16).toString('hex'),
|
|
28
|
+
oauth_signature_method: 'HMAC-SHA1',
|
|
29
|
+
oauth_timestamp: Math.floor(Date.now() / 1000).toString(),
|
|
30
|
+
oauth_version: '1.0',
|
|
31
|
+
...token ? {
|
|
32
|
+
oauth_token: token
|
|
33
|
+
} : {},
|
|
34
|
+
...params
|
|
35
|
+
};
|
|
36
|
+
const paramString = sortKeys(Object.keys(requestParameters)).map((key)=>`${encode(key)}=${encode(requestParameters[key])}`).join('&');
|
|
37
|
+
const signatureBaseString = [
|
|
38
|
+
method.toUpperCase(),
|
|
39
|
+
encode(url),
|
|
40
|
+
encode(paramString)
|
|
41
|
+
].join('&');
|
|
42
|
+
const signingMaterial = `${encode(clientCredential)}&${encode(tokenCredential || '')}`;
|
|
43
|
+
const signature = signRfc5849BaseString(signatureBaseString, signingMaterial);
|
|
44
|
+
const headerParameters = {
|
|
45
|
+
...requestParameters,
|
|
46
|
+
oauth_signature: signature
|
|
47
|
+
};
|
|
48
|
+
const header = `OAuth ${sortKeys(Object.keys(headerParameters)).map((key)=>`${encode(key)}="${encode(headerParameters[key])}"`).join(', ')}`;
|
|
49
|
+
return header;
|
|
50
|
+
};
|
|
51
|
+
const oauth1Request = async ({ method, url, consumerKey, clientCredential, token, tokenCredential, params = {} })=>{
|
|
52
|
+
const authorization = buildOAuth1Header({
|
|
53
|
+
method,
|
|
54
|
+
url,
|
|
55
|
+
params,
|
|
56
|
+
consumerKey,
|
|
57
|
+
clientCredential,
|
|
58
|
+
token,
|
|
59
|
+
tokenCredential
|
|
60
|
+
});
|
|
61
|
+
const response = await fetch(url, {
|
|
62
|
+
method,
|
|
63
|
+
headers: {
|
|
64
|
+
Authorization: authorization
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
const text = await response.text();
|
|
68
|
+
if (!response.ok) {
|
|
69
|
+
throw new Error(text || `OAuth1 request failed (${response.status})`);
|
|
70
|
+
}
|
|
71
|
+
return Object.fromEntries(new URLSearchParams(text));
|
|
72
|
+
};
|
|
73
|
+
const requestToken = async ({ requestUrl, redirectUri, consumerKey, clientCredential })=>oauth1Request({
|
|
74
|
+
method: 'POST',
|
|
75
|
+
url: requestUrl,
|
|
76
|
+
consumerKey,
|
|
77
|
+
clientCredential,
|
|
78
|
+
params: {
|
|
79
|
+
oauth_callback: redirectUri
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
const accessToken = async ({ accessUrl, consumerKey, clientCredential, oauthToken, oauthVerifier, oauthTokenCredential })=>oauth1Request({
|
|
83
|
+
method: 'POST',
|
|
84
|
+
url: accessUrl,
|
|
85
|
+
consumerKey,
|
|
86
|
+
clientCredential,
|
|
87
|
+
token: oauthToken,
|
|
88
|
+
tokenCredential: oauthTokenCredential,
|
|
89
|
+
params: {
|
|
90
|
+
oauth_verifier: oauthVerifier
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
const twitterGet = async ({ url, accessToken, accessCredential, consumerKey, clientCredential, qs = {} })=>{
|
|
94
|
+
const target = new URL(url);
|
|
95
|
+
const signedParams = {};
|
|
96
|
+
Object.entries(qs).forEach(([key, value])=>{
|
|
97
|
+
if (value !== undefined && value !== null) {
|
|
98
|
+
const stringValue = String(value);
|
|
99
|
+
target.searchParams.set(key, stringValue);
|
|
100
|
+
// RFC 5849 §3.4.1: base-string URI excludes the query; params are signed separately.
|
|
101
|
+
signedParams[key] = stringValue;
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
const authorization = buildOAuth1Header({
|
|
105
|
+
method: 'GET',
|
|
106
|
+
url: target.origin + target.pathname,
|
|
107
|
+
params: signedParams,
|
|
108
|
+
consumerKey,
|
|
109
|
+
clientCredential,
|
|
110
|
+
token: accessToken,
|
|
111
|
+
tokenCredential: accessCredential
|
|
112
|
+
});
|
|
113
|
+
const response = await fetch(target, {
|
|
114
|
+
headers: {
|
|
115
|
+
Authorization: authorization
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
const body = await response.json();
|
|
119
|
+
if (!response.ok) {
|
|
120
|
+
throw new Error(body.errors?.[0]?.message || `Twitter API error (${response.status})`);
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
body
|
|
124
|
+
};
|
|
125
|
+
};
|
|
126
|
+
oauth1 = {
|
|
127
|
+
buildOAuth1Header,
|
|
128
|
+
requestToken,
|
|
129
|
+
accessToken,
|
|
130
|
+
twitterGet
|
|
131
|
+
};
|
|
132
|
+
return oauth1;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export { requireOauth1 as __require };
|
|
136
|
+
//# sourceMappingURL=oauth1.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth1.mjs","sources":["../../../../server/src/utils/oauth-connect/oauth1.js"],"sourcesContent":["'use strict';\n\nconst crypto = require('node:crypto');\nconst { URLSearchParams } = require('node:url');\n\nconst encode = (str) =>\n encodeURIComponent(str).replace(\n /[!'()*]/g,\n (c) => `%${c.codePointAt(0).toString(16).toUpperCase()}`\n );\n\nconst sortKeys = (keys) =>\n keys.sort((a, b) => {\n if (a < b) return -1;\n if (a > b) return 1;\n return 0;\n });\n\n/**\n * OAuth 1.0 (RFC 5849) request signature — HMAC-SHA1 is required by the protocol.\n * This is not password storage or user-credential hashing (those use bcrypt).\n */\nconst signRfc5849BaseString = (signatureBaseString, signingMaterial) => {\n // codeql[js/insufficient-password-hash] OAuth 1.0 signing material, not user password storage\n return crypto.createHmac('sha1', signingMaterial).update(signatureBaseString).digest('base64');\n};\n\nconst buildOAuth1Header = ({\n method,\n url,\n params,\n consumerKey,\n clientCredential,\n token,\n tokenCredential,\n}) => {\n const requestParameters = {\n oauth_consumer_key: consumerKey,\n oauth_nonce: crypto.randomBytes(16).toString('hex'),\n oauth_signature_method: 'HMAC-SHA1',\n oauth_timestamp: Math.floor(Date.now() / 1000).toString(),\n oauth_version: '1.0',\n ...(token ? { oauth_token: token } : {}),\n ...params,\n };\n\n const paramString = sortKeys(Object.keys(requestParameters))\n .map((key) => `${encode(key)}=${encode(requestParameters[key])}`)\n .join('&');\n\n const signatureBaseString = [method.toUpperCase(), encode(url), encode(paramString)].join('&');\n const signingMaterial = `${encode(clientCredential)}&${encode(tokenCredential || '')}`;\n const signature = signRfc5849BaseString(signatureBaseString, signingMaterial);\n\n const headerParameters = { ...requestParameters, oauth_signature: signature };\n const header = `OAuth ${sortKeys(Object.keys(headerParameters))\n .map((key) => `${encode(key)}=\"${encode(headerParameters[key])}\"`)\n .join(', ')}`;\n\n return header;\n};\n\nconst oauth1Request = async ({\n method,\n url,\n consumerKey,\n clientCredential,\n token,\n tokenCredential,\n params = {},\n}) => {\n const authorization = buildOAuth1Header({\n method,\n url,\n params,\n consumerKey,\n clientCredential,\n token,\n tokenCredential,\n });\n\n const response = await fetch(url, {\n method,\n headers: { Authorization: authorization },\n });\n\n const text = await response.text();\n if (!response.ok) {\n throw new Error(text || `OAuth1 request failed (${response.status})`);\n }\n\n return Object.fromEntries(new URLSearchParams(text));\n};\n\nconst requestToken = async ({ requestUrl, redirectUri, consumerKey, clientCredential }) =>\n oauth1Request({\n method: 'POST',\n url: requestUrl,\n consumerKey,\n clientCredential,\n params: { oauth_callback: redirectUri },\n });\n\nconst accessToken = async ({\n accessUrl,\n consumerKey,\n clientCredential,\n oauthToken,\n oauthVerifier,\n oauthTokenCredential,\n}) =>\n oauth1Request({\n method: 'POST',\n url: accessUrl,\n consumerKey,\n clientCredential,\n token: oauthToken,\n tokenCredential: oauthTokenCredential,\n params: { oauth_verifier: oauthVerifier },\n });\n\nconst twitterGet = async ({\n url,\n accessToken,\n accessCredential,\n consumerKey,\n clientCredential,\n qs = {},\n}) => {\n const target = new URL(url);\n const signedParams = {};\n\n Object.entries(qs).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n const stringValue = String(value);\n target.searchParams.set(key, stringValue);\n // RFC 5849 §3.4.1: base-string URI excludes the query; params are signed separately.\n signedParams[key] = stringValue;\n }\n });\n\n const authorization = buildOAuth1Header({\n method: 'GET',\n url: target.origin + target.pathname,\n params: signedParams,\n consumerKey,\n clientCredential,\n token: accessToken,\n tokenCredential: accessCredential,\n });\n\n const response = await fetch(target, {\n headers: { Authorization: authorization },\n });\n\n const body = await response.json();\n if (!response.ok) {\n throw new Error(body.errors?.[0]?.message || `Twitter API error (${response.status})`);\n }\n\n return { body };\n};\n\nmodule.exports = {\n buildOAuth1Header,\n requestToken,\n accessToken,\n twitterGet,\n};\n"],"names":["crypto","require$$0","URLSearchParams","require$$1","encode","str","encodeURIComponent","replace","c","codePointAt","toString","toUpperCase","sortKeys","keys","sort","a","b","signRfc5849BaseString","signatureBaseString","signingMaterial","createHmac","update","digest","buildOAuth1Header","method","url","params","consumerKey","clientCredential","token","tokenCredential","requestParameters","oauth_consumer_key","oauth_nonce","randomBytes","oauth_signature_method","oauth_timestamp","Math","floor","Date","now","oauth_version","oauth_token","paramString","Object","map","key","join","signature","headerParameters","oauth_signature","header","oauth1Request","authorization","response","fetch","headers","Authorization","text","ok","Error","status","fromEntries","requestToken","requestUrl","redirectUri","oauth_callback","accessToken","accessUrl","oauthToken","oauthVerifier","oauthTokenCredential","oauth_verifier","twitterGet","accessCredential","qs","target","URL","signedParams","entries","forEach","value","undefined","stringValue","String","searchParams","set","origin","pathname","body","json","errors","message","oauth1"],"mappings":"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"}
|