@strapi/plugin-users-permissions 5.51.2 → 5.52.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/admin/src/translations/en.json +0 -1
- package/dist/server/bootstrap/index.js.map +1 -1
- package/dist/server/bootstrap/index.mjs.map +1 -1
- package/dist/server/config.js.map +1 -1
- package/dist/server/config.mjs.map +1 -1
- package/dist/server/controllers/auth.js.map +1 -1
- 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/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.map +1 -1
- package/dist/server/controllers/validation/auth.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/login.js.map +1 -1
- package/dist/server/graphql/mutations/auth/login.mjs.map +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.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.map +1 -1
- package/dist/server/graphql/mutations/crud/user/create-user.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/register.js.map +1 -1
- package/dist/server/register.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.map +1 -1
- package/dist/server/services/providers-registry.mjs.map +1 -1
- package/dist/server/services/providers.js.map +1 -1
- package/dist/server/services/providers.mjs.map +1 -1
- package/dist/server/services/role.js.map +1 -1
- package/dist/server/services/role.mjs.map +1 -1
- package/dist/server/services/user.js.map +1 -1
- package/dist/server/services/user.mjs.map +1 -1
- package/dist/server/services/users-permissions.js.map +1 -1
- package/dist/server/services/users-permissions.mjs.map +1 -1
- package/dist/server/strategies/users-permissions.js.map +1 -1
- 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.map +1 -1
- package/dist/server/utils/oauth-connect/index.mjs.map +1 -1
- package/dist/server/utils/oauth-connect/oauth1.js.map +1 -1
- package/dist/server/utils/oauth-connect/oauth1.mjs.map +1 -1
- package/dist/server/utils/oauth-connect/oauth2.js.map +1 -1
- package/dist/server/utils/oauth-connect/oauth2.mjs.map +1 -1
- package/dist/server/utils/provider-http.js.map +1 -1
- package/dist/server/utils/provider-http.mjs.map +1 -1
- package/dist/server/utils/verify-jwt-with-jwks.js.map +1 -1
- package/dist/server/utils/verify-jwt-with-jwks.mjs.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","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');\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 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 const payload = oauth2.tokensToQueryPayload(provider, tokenResponse);\n ctx.session.grant = {};\n return redirectWithPayload(ctx, callbackUrl, payload);\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 const payload = oauth2.tokensToQueryPayload(provider, tokenResponse);\n ctx.session.grant = {};\n return redirectWithPayload(ctx, callbackUrl, payload);\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","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","startOAuth1Flow","parsed","requestToken","requestUrl","consumerKey","clientCredential","request","authorizeUrl","encodeURIComponent","oauth_token","startOAuth2Flow","state","generateState","buildAuthorizeUrl","handleOAuth1Callback","oauthToken","oauth_verifier","oauthVerifier","query","Error","tokenResponse","accessToken","accessUrl","oauthTokenCredential","oauth_token_secret","tokensToQueryPayload","handleOAuth2Callback","code","queryState","error","error_description","errorDescription","exchangeAuthorizationCode","createOAuthConnectMiddleware","next","strapi","config","get","throw","storedProviders","store","type","enabled","ApplicationError","getService","require$$4","buildRedirectUri","callbackOverride","oauthConnect","effectiveConfig","err","message"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","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');\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 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 const payload = oauth2.tokensToQueryPayload(provider, tokenResponse);\n ctx.session.grant = {};\n return redirectWithPayload(ctx, callbackUrl, payload);\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 const payload = oauth2.tokensToQueryPayload(provider, tokenResponse);\n ctx.session.grant = {};\n return redirectWithPayload(ctx, callbackUrl, payload);\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","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","startOAuth1Flow","parsed","requestToken","requestUrl","consumerKey","clientCredential","request","authorizeUrl","encodeURIComponent","oauth_token","startOAuth2Flow","state","generateState","buildAuthorizeUrl","handleOAuth1Callback","oauthToken","oauth_verifier","oauthVerifier","query","Error","tokenResponse","accessToken","accessUrl","oauthTokenCredential","oauth_token_secret","tokensToQueryPayload","handleOAuth2Callback","code","queryState","error","error_description","errorDescription","exchangeAuthorizationCode","createOAuthConnectMiddleware","next","strapi","config","get","throw","storedProviders","store","type","enabled","ApplicationError","getService","require$$4","buildRedirectUri","callbackOverride","oauthConnect","effectiveConfig","err","message"],"mappings":"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"}
|
|
@@ -1 +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');\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 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 const payload = oauth2.tokensToQueryPayload(provider, tokenResponse);\n ctx.session.grant = {};\n return redirectWithPayload(ctx, callbackUrl, payload);\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 const payload = oauth2.tokensToQueryPayload(provider, tokenResponse);\n ctx.session.grant = {};\n return redirectWithPayload(ctx, callbackUrl, payload);\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","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","startOAuth1Flow","parsed","requestToken","requestUrl","consumerKey","clientCredential","request","authorizeUrl","encodeURIComponent","oauth_token","startOAuth2Flow","state","generateState","buildAuthorizeUrl","handleOAuth1Callback","oauthToken","oauth_verifier","oauthVerifier","query","Error","tokenResponse","accessToken","accessUrl","oauthTokenCredential","oauth_token_secret","tokensToQueryPayload","handleOAuth2Callback","code","queryState","error","error_description","errorDescription","exchangeAuthorizationCode","createOAuthConnectMiddleware","next","strapi","config","get","throw","storedProviders","store","type","enabled","ApplicationError","getService","require$$4","buildRedirectUri","callbackOverride","oauthConnect","effectiveConfig","err","message"],"mappings":"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"}
|
|
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');\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 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 const payload = oauth2.tokensToQueryPayload(provider, tokenResponse);\n ctx.session.grant = {};\n return redirectWithPayload(ctx, callbackUrl, payload);\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 const payload = oauth2.tokensToQueryPayload(provider, tokenResponse);\n ctx.session.grant = {};\n return redirectWithPayload(ctx, callbackUrl, payload);\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","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","startOAuth1Flow","parsed","requestToken","requestUrl","consumerKey","clientCredential","request","authorizeUrl","encodeURIComponent","oauth_token","startOAuth2Flow","state","generateState","buildAuthorizeUrl","handleOAuth1Callback","oauthToken","oauth_verifier","oauthVerifier","query","Error","tokenResponse","accessToken","accessUrl","oauthTokenCredential","oauth_token_secret","tokensToQueryPayload","handleOAuth2Callback","code","queryState","error","error_description","errorDescription","exchangeAuthorizationCode","createOAuthConnectMiddleware","next","strapi","config","get","throw","storedProviders","store","type","enabled","ApplicationError","getService","require$$4","buildRedirectUri","callbackOverride","oauthConnect","effectiveConfig","err","message"],"mappings":"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"}
|
|
@@ -1 +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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"}
|
|
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":";;;;;;;;;;AAEA,IAAA,MAAMA,MAAAA,GAASC,uCAAAA,EAAAA;IACf,MAAM,EAAEC,eAAe,EAAE,GAAGC,oCAAAA,EAAAA;IAE5B,MAAMC,MAAAA,GAAS,CAACC,GAAAA,GACdC,kBAAAA,CAAmBD,KAAKE,OAAO,CAC7B,YACA,CAACC,CAAAA,GAAM,CAAC,CAAC,EAAEA,EAAEC,WAAW,CAAC,GAAGC,QAAQ,CAAC,EAAA,CAAA,CAAIC,WAAW,EAAA,CAAA,CAAG,CAAA;AAG3D,IAAA,MAAMC,WAAW,CAACC,IAAAA,GAChBA,KAAKC,IAAI,CAAC,CAACC,CAAAA,EAAGC,CAAAA,GAAAA;YACZ,IAAID,CAAAA,GAAIC,CAAAA,EAAG,OAAO,EAAC;YACnB,IAAID,CAAAA,GAAIC,GAAG,OAAO,CAAA;YAClB,OAAO,CAAA;AACX,QAAA,CAAA,CAAA;AAEA;;;KAIA,MAAMC,qBAAAA,GAAwB,CAACC,mBAAAA,EAAqBC,eAAAA,GAAAA;;QAElD,OAAOnB,MAAAA,CAAOoB,UAAU,CAAC,MAAA,EAAQD,iBAAiBE,MAAM,CAACH,mBAAAA,CAAAA,CAAqBI,MAAM,CAAC,QAAA,CAAA;AACvF,IAAA,CAAA;AAEA,IAAA,MAAMC,oBAAoB,CAAC,EACzBC,MAAM,EACNC,GAAG,EACHC,MAAM,EACNC,WAAW,EACXC,gBAAgB,EAChBC,KAAK,EACLC,eAAe,EAChB,GAAA;AACC,QAAA,MAAMC,iBAAAA,GAAoB;YACxBC,kBAAAA,EAAoBL,WAAAA;AACpBM,YAAAA,WAAAA,EAAajC,MAAAA,CAAOkC,WAAW,CAAC,EAAA,CAAA,CAAIxB,QAAQ,CAAC,KAAA,CAAA;YAC7CyB,sBAAAA,EAAwB,WAAA;AACxBC,YAAAA,eAAAA,EAAiBC,KAAKC,KAAK,CAACC,KAAKC,GAAG,EAAA,GAAK,MAAM9B,QAAQ,EAAA;YACvD+B,aAAAA,EAAe,KAAA;AACf,YAAA,GAAIZ,KAAAA,GAAQ;gBAAEa,WAAAA,EAAab;AAAK,aAAA,GAAK,EAAE;AACvC,YAAA,GAAGH;AACP,SAAA;QAEE,MAAMiB,WAAAA,GAAc/B,SAASgC,MAAAA,CAAO/B,IAAI,CAACkB,iBAAAA,CAAAA,CAAAA,CACtCc,GAAG,CAAC,CAACC,GAAAA,GAAQ,CAAA,EAAG1C,OAAO0C,GAAAA,CAAAA,CAAK,CAAC,EAAE1C,MAAAA,CAAO2B,iBAAiB,CAACe,GAAAA,CAAI,CAAA,CAAA,CAAG,CAAA,CAC/DC,IAAI,CAAC,GAAA,CAAA;AAER,QAAA,MAAM7B,mBAAAA,GAAsB;AAACM,YAAAA,MAAAA,CAAOb,WAAW,EAAA;YAAIP,MAAAA,CAAOqB,GAAAA,CAAAA;YAAMrB,MAAAA,CAAOuC,WAAAA;AAAa,SAAA,CAACI,IAAI,CAAC,GAAA,CAAA;QAC1F,MAAM5B,eAAAA,GAAkB,GAAGf,MAAAA,CAAOwB,gBAAAA,CAAAA,CAAkB,CAAC,EAAExB,MAAAA,CAAO0B,mBAAmB,EAAA,CAAA,CAAA,CAAK;QACtF,MAAMkB,SAAAA,GAAY/B,sBAAsBC,mBAAAA,EAAqBC,eAAAA,CAAAA;AAE7D,QAAA,MAAM8B,gBAAAA,GAAmB;AAAE,YAAA,GAAGlB,iBAAiB;YAAEmB,eAAAA,EAAiBF;AAAS,SAAA;AAC3E,QAAA,MAAMG,MAAAA,GAAS,CAAC,MAAM,EAAEvC,QAAAA,CAASgC,MAAAA,CAAO/B,IAAI,CAACoC,gBAAAA,CAAAA,CAAAA,CAC1CJ,GAAG,CAAC,CAACC,GAAAA,GAAQ,CAAA,EAAG1C,MAAAA,CAAO0C,GAAAA,CAAAA,CAAK,EAAE,EAAE1C,MAAAA,CAAO6C,gBAAgB,CAACH,GAAAA,CAAI,CAAA,CAAE,CAAC,CAAC,CAAA,CAChEC,IAAI,CAAC,IAAA,CAAA,CAAA,CAAO;QAEf,OAAOI,MAAAA;AACT,IAAA,CAAA;AAEA,IAAA,MAAMC,gBAAgB,OAAO,EAC3B5B,MAAM,EACNC,GAAG,EACHE,WAAW,EACXC,gBAAgB,EAChBC,KAAK,EACLC,eAAe,EACfJ,MAAAA,GAAS,EAAE,EACZ,GAAA;AACC,QAAA,MAAM2B,gBAAgB9B,iBAAAA,CAAkB;AACtCC,YAAAA,MAAAA;AACAC,YAAAA,GAAAA;AACAC,YAAAA,MAAAA;AACAC,YAAAA,WAAAA;AACAC,YAAAA,gBAAAA;AACAC,YAAAA,KAAAA;AACAC,YAAAA;AACJ,SAAA,CAAA;QAEE,MAAMwB,QAAAA,GAAW,MAAMC,KAAAA,CAAM9B,GAAAA,EAAK;AAChCD,YAAAA,MAAAA;YACAgC,OAAAA,EAAS;gBAAEC,aAAAA,EAAeJ;AAAa;AAC3C,SAAA,CAAA;QAEE,MAAMK,IAAAA,GAAO,MAAMJ,QAAAA,CAASI,IAAI,EAAA;QAChC,IAAI,CAACJ,QAAAA,CAASK,EAAE,EAAE;YAChB,MAAM,IAAIC,KAAAA,CAAMF,IAAAA,IAAQ,CAAC,uBAAuB,EAAEJ,QAAAA,CAASO,MAAM,CAAC,CAAC,CAAC,CAAA;AACxE,QAAA;AAEE,QAAA,OAAOjB,MAAAA,CAAOkB,WAAW,CAAC,IAAI5D,eAAAA,CAAgBwD,IAAAA,CAAAA,CAAAA;AAChD,IAAA,CAAA;AAEA,IAAA,MAAMK,YAAAA,GAAe,OAAO,EAAEC,UAAU,EAAEC,WAAW,EAAEtC,WAAW,EAAEC,gBAAgB,EAAE,GACpFwB,aAAAA,CAAc;YACZ5B,MAAAA,EAAQ,MAAA;YACRC,GAAAA,EAAKuC,UAAAA;AACLrC,YAAAA,WAAAA;AACAC,YAAAA,gBAAAA;YACAF,MAAAA,EAAQ;gBAAEwC,cAAAA,EAAgBD;AAAW;AACzC,SAAA,CAAA;AAEA,IAAA,MAAME,cAAc,OAAO,EACzBC,SAAS,EACTzC,WAAW,EACXC,gBAAgB,EAChByC,UAAU,EACVC,aAAa,EACbC,oBAAoB,EACrB,GACCnB,aAAAA,CAAc;YACZ5B,MAAAA,EAAQ,MAAA;YACRC,GAAAA,EAAK2C,SAAAA;AACLzC,YAAAA,WAAAA;AACAC,YAAAA,gBAAAA;YACAC,KAAAA,EAAOwC,UAAAA;YACPvC,eAAAA,EAAiByC,oBAAAA;YACjB7C,MAAAA,EAAQ;gBAAE8C,cAAAA,EAAgBF;AAAa;AAC3C,SAAA,CAAA;AAEA,IAAA,MAAMG,aAAa,OAAO,EACxBhD,GAAG,EACH0C,WAAW,EACXO,gBAAgB,EAChB/C,WAAW,EACXC,gBAAgB,EAChB+C,EAAAA,GAAK,EAAE,EACR,GAAA;QACC,MAAMC,MAAAA,GAAS,IAAIC,GAAAA,CAAIpD,GAAAA,CAAAA;AACvB,QAAA,MAAMqD,eAAe,EAAA;QAErBlC,MAAAA,CAAOmC,OAAO,CAACJ,EAAAA,CAAAA,CAAIK,OAAO,CAAC,CAAC,CAAClC,KAAKmC,KAAAA,CAAM,GAAA;YACtC,IAAIA,KAAAA,KAAUC,SAAAA,IAAaD,KAAAA,KAAU,IAAA,EAAM;AACzC,gBAAA,MAAME,cAAcC,MAAAA,CAAOH,KAAAA,CAAAA;AAC3BL,gBAAAA,MAAAA,CAAOS,YAAY,CAACC,GAAG,CAACxC,GAAAA,EAAKqC,WAAAA,CAAAA;;gBAE7BL,YAAY,CAAChC,IAAI,GAAGqC,WAAAA;AAC1B,YAAA;AACA,QAAA,CAAA,CAAA;AAEE,QAAA,MAAM9B,gBAAgB9B,iBAAAA,CAAkB;YACtCC,MAAAA,EAAQ,KAAA;AACRC,YAAAA,GAAAA,EAAKmD,MAAAA,CAAOW,MAAM,GAAGX,MAAAA,CAAOY,QAAQ;YACpC9D,MAAAA,EAAQoD,YAAAA;AACRnD,YAAAA,WAAAA;AACAC,YAAAA,gBAAAA;YACAC,KAAAA,EAAOsC,WAAAA;YACPrC,eAAAA,EAAiB4C;AACrB,SAAA,CAAA;QAEE,MAAMpB,QAAAA,GAAW,MAAMC,KAAAA,CAAMqB,MAAAA,EAAQ;YACnCpB,OAAAA,EAAS;gBAAEC,aAAAA,EAAeJ;AAAa;AAC3C,SAAA,CAAA;QAEE,MAAMoC,IAAAA,GAAO,MAAMnC,QAAAA,CAASoC,IAAI,EAAA;QAChC,IAAI,CAACpC,QAAAA,CAASK,EAAE,EAAE;AAChB,YAAA,MAAM,IAAIC,KAAAA,CAAM6B,IAAAA,CAAKE,MAAM,GAAG,CAAA,CAAE,EAAEC,OAAAA,IAAW,CAAC,mBAAmB,EAAEtC,QAAAA,CAASO,MAAM,CAAC,CAAC,CAAC,CAAA;AACzF,QAAA;QAEE,OAAO;AAAE4B,YAAAA;AAAI,SAAA;AACf,IAAA,CAAA;IAEAI,MAAAA,GAAiB;AACftE,QAAAA,iBAAAA;AACAwC,QAAAA,YAAAA;AACAI,QAAAA,WAAAA;AACAM,QAAAA;AACF,KAAA;;;;;;"}
|
|
@@ -1 +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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"}
|
|
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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth2.js","sources":["../../../../server/src/utils/oauth-connect/oauth2.js"],"sourcesContent":["'use strict';\n\nconst crypto = require('node:crypto');\n\nconst formatScope = (scope, delimiter = ',') => {\n if (Array.isArray(scope)) {\n return scope.filter(Boolean).join(delimiter) || undefined;\n }\n return scope || undefined;\n};\n\nconst substituteSubdomain = (url, subdomain) =>\n subdomain ? url.replace('[subdomain]', subdomain) : url;\n\nconst buildAuthorizeUrl = (provider, { key, redirectUri, scope, subdomain }) => {\n const authorizeUrl = substituteSubdomain(provider.authorize_url, subdomain);\n const params = new URLSearchParams({\n client_id: key,\n response_type: 'code',\n redirect_uri: redirectUri,\n });\n\n const formattedScope = formatScope(scope, provider.scope_delimiter);\n if (formattedScope) {\n params.set('scope', formattedScope);\n }\n\n if (provider.name === 'instagram' && /^\\d+$/.test(key)) {\n params.delete('client_id');\n params.set('app_id', key);\n if (formattedScope) {\n params.set('scope', formattedScope.replaceAll(' ', ','));\n }\n }\n\n return `${authorizeUrl}?${params.toString()}`;\n};\n\nconst parseTokenResponse = async (response) => {\n const contentType = response.headers.get('content-type') || '';\n if (contentType.includes('application/json')) {\n return response.json();\n }\n const text = await response.text();\n return Object.fromEntries(new URLSearchParams(text));\n};\n\nconst exchangeAuthorizationCode = async (\n provider,\n { key, secret, redirectUri, code, subdomain }\n) => {\n const accessUrl = substituteSubdomain(provider.access_url, subdomain);\n const body = new URLSearchParams({\n grant_type: 'authorization_code',\n code,\n redirect_uri: redirectUri,\n client_id: key,\n client_secret: secret,\n });\n\n const headers = { 'Content-Type': 'application/x-www-form-urlencoded' };\n\n if (provider.token_endpoint_auth_method === 'client_secret_basic') {\n const credentials = Buffer.from(`${key}:${secret}`).toString('base64');\n headers.Authorization = `Basic ${credentials}`;\n body.delete('client_id');\n body.delete('client_secret');\n }\n\n if (provider.name === 'instagram' && /^\\d+$/.test(key)) {\n body.delete('client_id');\n body.delete('client_secret');\n body.set('app_id', key);\n body.set('app_secret', secret);\n }\n\n const response = await fetch(accessUrl, { method: 'POST', headers, body });\n const output = await parseTokenResponse(response);\n\n if (!response.ok) {\n throw new Error(\n output.error_description || output.error || `Token exchange failed (${response.status})`\n );\n }\n\n return output;\n};\n\nconst tokensToQueryPayload = (provider, tokenResponse) => {\n const data = { raw: tokenResponse };\n\n if (provider.oauth === 1) {\n if (tokenResponse.oauth_token) {\n data.access_token = tokenResponse.oauth_token;\n }\n if (tokenResponse.oauth_token_secret) {\n data.access_secret = tokenResponse.oauth_token_secret;\n }\n return data;\n }\n\n if (tokenResponse.id_token) {\n data.id_token = tokenResponse.id_token;\n }\n if (tokenResponse.access_token) {\n data.access_token = tokenResponse.access_token;\n }\n if (tokenResponse.refresh_token) {\n data.refresh_token = tokenResponse.refresh_token;\n }\n\n return data;\n};\n\nconst generateState = () => crypto.randomBytes(20).toString('hex');\n\nmodule.exports = {\n buildAuthorizeUrl,\n exchangeAuthorizationCode,\n tokensToQueryPayload,\n generateState,\n substituteSubdomain,\n};\n"],"names":["crypto","require$$0","formatScope","scope","delimiter","Array","isArray","filter","Boolean","join","undefined","substituteSubdomain","url","subdomain","replace","buildAuthorizeUrl","provider","key","redirectUri","authorizeUrl","authorize_url","params","URLSearchParams","client_id","response_type","redirect_uri","formattedScope","scope_delimiter","set","name","test","delete","replaceAll","toString","parseTokenResponse","response","contentType","headers","get","includes","json","text","Object","fromEntries","exchangeAuthorizationCode","secret","code","accessUrl","access_url","body","grant_type","client_secret","token_endpoint_auth_method","credentials","Buffer","from","Authorization","fetch","method","output","ok","Error","error_description","error","status","tokensToQueryPayload","tokenResponse","data","raw","oauth","oauth_token","access_token","oauth_token_secret","access_secret","id_token","refresh_token","generateState","randomBytes","oauth2"],"mappings":";;;;;;;;;AAEA,IAAA,MAAMA,MAAAA,GAASC,uCAAAA,EAAAA;AAEf,IAAA,MAAMC,WAAAA,GAAc,CAACC,KAAAA,EAAOC,SAAAA,GAAY,GAAG,GAAA;QACzC,IAAIC,KAAAA,CAAMC,OAAO,CAACH,KAAAA,CAAAA,EAAQ;AACxB,YAAA,OAAOA,MAAMI,MAAM,CAACC,OAAAA,CAAAA,CAASC,IAAI,CAACL,SAAAA,CAAAA,IAAcM,SAAAA;AACpD,QAAA;AACE,QAAA,OAAOP,KAAAA,IAASO,SAAAA;AAClB,IAAA,CAAA;IAEA,MAAMC,mBAAAA,GAAsB,CAACC,GAAAA,EAAKC,SAAAA,GAChCA,YAAYD,GAAAA,CAAIE,OAAO,CAAC,aAAA,EAAeD,SAAAA,CAAAA,GAAaD,GAAAA;IAEtD,MAAMG,iBAAAA,GAAoB,CAACC,QAAAA,EAAU,EAAEC,GAAG,EAAEC,WAAW,EAAEf,KAAK,EAAEU,SAAS,EAAE,GAAA;AACzE,QAAA,MAAMM,YAAAA,GAAeR,mBAAAA,CAAoBK,QAAAA,CAASI,aAAa,EAAEP,SAAAA,CAAAA;QACjE,MAAMQ,MAAAA,GAAS,IAAIC,eAAAA,CAAgB;YACjCC,SAAAA,EAAWN,GAAAA;YACXO,aAAAA,EAAe,MAAA;YACfC,YAAAA,EAAcP;AAClB,SAAA,CAAA;AAEE,QAAA,MAAMQ,cAAAA,GAAiBxB,WAAAA,CAAYC,KAAAA,EAAOa,QAAAA,CAASW,eAAe,CAAA;AAClE,QAAA,IAAID,cAAAA,EAAgB;YAClBL,MAAAA,CAAOO,GAAG,CAAC,OAAA,EAASF,cAAAA,CAAAA;AACxB,QAAA;AAEE,QAAA,IAAIV,SAASa,IAAI,KAAK,eAAe,OAAA,CAAQC,IAAI,CAACb,GAAAA,CAAAA,EAAM;AACtDI,YAAAA,MAAAA,CAAOU,MAAM,CAAC,WAAA,CAAA;YACdV,MAAAA,CAAOO,GAAG,CAAC,QAAA,EAAUX,GAAAA,CAAAA;AACrB,YAAA,IAAIS,cAAAA,EAAgB;AAClBL,gBAAAA,MAAAA,CAAOO,GAAG,CAAC,OAAA,EAASF,cAAAA,CAAeM,UAAU,CAAC,GAAA,EAAK,GAAA,CAAA,CAAA;AACzD,YAAA;AACA,QAAA;AAEE,QAAA,OAAO,GAAGb,YAAAA,CAAa,CAAC,EAAEE,MAAAA,CAAOY,QAAQ,EAAA,CAAA,CAAI;AAC/C,IAAA,CAAA;AAEA,IAAA,MAAMC,qBAAqB,OAAOC,QAAAA,GAAAA;AAChC,QAAA,MAAMC,cAAcD,QAAAA,CAASE,OAAO,CAACC,GAAG,CAAC,cAAA,CAAA,IAAmB,EAAA;QAC5D,IAAIF,WAAAA,CAAYG,QAAQ,CAAC,kBAAA,CAAA,EAAqB;AAC5C,YAAA,OAAOJ,SAASK,IAAI,EAAA;AACxB,QAAA;QACE,MAAMC,IAAAA,GAAO,MAAMN,QAAAA,CAASM,IAAI,EAAA;AAChC,QAAA,OAAOC,MAAAA,CAAOC,WAAW,CAAC,IAAIrB,eAAAA,CAAgBmB,IAAAA,CAAAA,CAAAA;AAChD,IAAA,CAAA;AAEA,IAAA,MAAMG,yBAAAA,GAA4B,OAChC5B,QAAAA,EACA,EAAEC,GAAG,EAAE4B,MAAM,EAAE3B,WAAW,EAAE4B,IAAI,EAAEjC,SAAS,
|
|
1
|
+
{"version":3,"file":"oauth2.js","sources":["../../../../server/src/utils/oauth-connect/oauth2.js"],"sourcesContent":["'use strict';\n\nconst crypto = require('node:crypto');\n\nconst formatScope = (scope, delimiter = ',') => {\n if (Array.isArray(scope)) {\n return scope.filter(Boolean).join(delimiter) || undefined;\n }\n return scope || undefined;\n};\n\nconst substituteSubdomain = (url, subdomain) =>\n subdomain ? url.replace('[subdomain]', subdomain) : url;\n\nconst buildAuthorizeUrl = (provider, { key, redirectUri, scope, subdomain }) => {\n const authorizeUrl = substituteSubdomain(provider.authorize_url, subdomain);\n const params = new URLSearchParams({\n client_id: key,\n response_type: 'code',\n redirect_uri: redirectUri,\n });\n\n const formattedScope = formatScope(scope, provider.scope_delimiter);\n if (formattedScope) {\n params.set('scope', formattedScope);\n }\n\n if (provider.name === 'instagram' && /^\\d+$/.test(key)) {\n params.delete('client_id');\n params.set('app_id', key);\n if (formattedScope) {\n params.set('scope', formattedScope.replaceAll(' ', ','));\n }\n }\n\n return `${authorizeUrl}?${params.toString()}`;\n};\n\nconst parseTokenResponse = async (response) => {\n const contentType = response.headers.get('content-type') || '';\n if (contentType.includes('application/json')) {\n return response.json();\n }\n const text = await response.text();\n return Object.fromEntries(new URLSearchParams(text));\n};\n\nconst exchangeAuthorizationCode = async (\n provider,\n { key, secret, redirectUri, code, subdomain }\n) => {\n const accessUrl = substituteSubdomain(provider.access_url, subdomain);\n const body = new URLSearchParams({\n grant_type: 'authorization_code',\n code,\n redirect_uri: redirectUri,\n client_id: key,\n client_secret: secret,\n });\n\n const headers = { 'Content-Type': 'application/x-www-form-urlencoded' };\n\n if (provider.token_endpoint_auth_method === 'client_secret_basic') {\n const credentials = Buffer.from(`${key}:${secret}`).toString('base64');\n headers.Authorization = `Basic ${credentials}`;\n body.delete('client_id');\n body.delete('client_secret');\n }\n\n if (provider.name === 'instagram' && /^\\d+$/.test(key)) {\n body.delete('client_id');\n body.delete('client_secret');\n body.set('app_id', key);\n body.set('app_secret', secret);\n }\n\n const response = await fetch(accessUrl, { method: 'POST', headers, body });\n const output = await parseTokenResponse(response);\n\n if (!response.ok) {\n throw new Error(\n output.error_description || output.error || `Token exchange failed (${response.status})`\n );\n }\n\n return output;\n};\n\nconst tokensToQueryPayload = (provider, tokenResponse) => {\n const data = { raw: tokenResponse };\n\n if (provider.oauth === 1) {\n if (tokenResponse.oauth_token) {\n data.access_token = tokenResponse.oauth_token;\n }\n if (tokenResponse.oauth_token_secret) {\n data.access_secret = tokenResponse.oauth_token_secret;\n }\n return data;\n }\n\n if (tokenResponse.id_token) {\n data.id_token = tokenResponse.id_token;\n }\n if (tokenResponse.access_token) {\n data.access_token = tokenResponse.access_token;\n }\n if (tokenResponse.refresh_token) {\n data.refresh_token = tokenResponse.refresh_token;\n }\n\n return data;\n};\n\nconst generateState = () => crypto.randomBytes(20).toString('hex');\n\nmodule.exports = {\n buildAuthorizeUrl,\n exchangeAuthorizationCode,\n tokensToQueryPayload,\n generateState,\n substituteSubdomain,\n};\n"],"names":["crypto","require$$0","formatScope","scope","delimiter","Array","isArray","filter","Boolean","join","undefined","substituteSubdomain","url","subdomain","replace","buildAuthorizeUrl","provider","key","redirectUri","authorizeUrl","authorize_url","params","URLSearchParams","client_id","response_type","redirect_uri","formattedScope","scope_delimiter","set","name","test","delete","replaceAll","toString","parseTokenResponse","response","contentType","headers","get","includes","json","text","Object","fromEntries","exchangeAuthorizationCode","secret","code","accessUrl","access_url","body","grant_type","client_secret","token_endpoint_auth_method","credentials","Buffer","from","Authorization","fetch","method","output","ok","Error","error_description","error","status","tokensToQueryPayload","tokenResponse","data","raw","oauth","oauth_token","access_token","oauth_token_secret","access_secret","id_token","refresh_token","generateState","randomBytes","oauth2"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth2.mjs","sources":["../../../../server/src/utils/oauth-connect/oauth2.js"],"sourcesContent":["'use strict';\n\nconst crypto = require('node:crypto');\n\nconst formatScope = (scope, delimiter = ',') => {\n if (Array.isArray(scope)) {\n return scope.filter(Boolean).join(delimiter) || undefined;\n }\n return scope || undefined;\n};\n\nconst substituteSubdomain = (url, subdomain) =>\n subdomain ? url.replace('[subdomain]', subdomain) : url;\n\nconst buildAuthorizeUrl = (provider, { key, redirectUri, scope, subdomain }) => {\n const authorizeUrl = substituteSubdomain(provider.authorize_url, subdomain);\n const params = new URLSearchParams({\n client_id: key,\n response_type: 'code',\n redirect_uri: redirectUri,\n });\n\n const formattedScope = formatScope(scope, provider.scope_delimiter);\n if (formattedScope) {\n params.set('scope', formattedScope);\n }\n\n if (provider.name === 'instagram' && /^\\d+$/.test(key)) {\n params.delete('client_id');\n params.set('app_id', key);\n if (formattedScope) {\n params.set('scope', formattedScope.replaceAll(' ', ','));\n }\n }\n\n return `${authorizeUrl}?${params.toString()}`;\n};\n\nconst parseTokenResponse = async (response) => {\n const contentType = response.headers.get('content-type') || '';\n if (contentType.includes('application/json')) {\n return response.json();\n }\n const text = await response.text();\n return Object.fromEntries(new URLSearchParams(text));\n};\n\nconst exchangeAuthorizationCode = async (\n provider,\n { key, secret, redirectUri, code, subdomain }\n) => {\n const accessUrl = substituteSubdomain(provider.access_url, subdomain);\n const body = new URLSearchParams({\n grant_type: 'authorization_code',\n code,\n redirect_uri: redirectUri,\n client_id: key,\n client_secret: secret,\n });\n\n const headers = { 'Content-Type': 'application/x-www-form-urlencoded' };\n\n if (provider.token_endpoint_auth_method === 'client_secret_basic') {\n const credentials = Buffer.from(`${key}:${secret}`).toString('base64');\n headers.Authorization = `Basic ${credentials}`;\n body.delete('client_id');\n body.delete('client_secret');\n }\n\n if (provider.name === 'instagram' && /^\\d+$/.test(key)) {\n body.delete('client_id');\n body.delete('client_secret');\n body.set('app_id', key);\n body.set('app_secret', secret);\n }\n\n const response = await fetch(accessUrl, { method: 'POST', headers, body });\n const output = await parseTokenResponse(response);\n\n if (!response.ok) {\n throw new Error(\n output.error_description || output.error || `Token exchange failed (${response.status})`\n );\n }\n\n return output;\n};\n\nconst tokensToQueryPayload = (provider, tokenResponse) => {\n const data = { raw: tokenResponse };\n\n if (provider.oauth === 1) {\n if (tokenResponse.oauth_token) {\n data.access_token = tokenResponse.oauth_token;\n }\n if (tokenResponse.oauth_token_secret) {\n data.access_secret = tokenResponse.oauth_token_secret;\n }\n return data;\n }\n\n if (tokenResponse.id_token) {\n data.id_token = tokenResponse.id_token;\n }\n if (tokenResponse.access_token) {\n data.access_token = tokenResponse.access_token;\n }\n if (tokenResponse.refresh_token) {\n data.refresh_token = tokenResponse.refresh_token;\n }\n\n return data;\n};\n\nconst generateState = () => crypto.randomBytes(20).toString('hex');\n\nmodule.exports = {\n buildAuthorizeUrl,\n exchangeAuthorizationCode,\n tokensToQueryPayload,\n generateState,\n substituteSubdomain,\n};\n"],"names":["crypto","require$$0","formatScope","scope","delimiter","Array","isArray","filter","Boolean","join","undefined","substituteSubdomain","url","subdomain","replace","buildAuthorizeUrl","provider","key","redirectUri","authorizeUrl","authorize_url","params","URLSearchParams","client_id","response_type","redirect_uri","formattedScope","scope_delimiter","set","name","test","delete","replaceAll","toString","parseTokenResponse","response","contentType","headers","get","includes","json","text","Object","fromEntries","exchangeAuthorizationCode","secret","code","accessUrl","access_url","body","grant_type","client_secret","token_endpoint_auth_method","credentials","Buffer","from","Authorization","fetch","method","output","ok","Error","error_description","error","status","tokensToQueryPayload","tokenResponse","data","raw","oauth","oauth_token","access_token","oauth_token_secret","access_secret","id_token","refresh_token","generateState","randomBytes","oauth2"],"mappings":";;;;;;;AAEA,IAAA,MAAMA,MAAAA,GAASC,SAAAA,EAAAA;AAEf,IAAA,MAAMC,WAAAA,GAAc,CAACC,KAAAA,EAAOC,SAAAA,GAAY,GAAG,GAAA;QACzC,IAAIC,KAAAA,CAAMC,OAAO,CAACH,KAAAA,CAAAA,EAAQ;AACxB,YAAA,OAAOA,MAAMI,MAAM,CAACC,OAAAA,CAAAA,CAASC,IAAI,CAACL,SAAAA,CAAAA,IAAcM,SAAAA;AACpD,QAAA;AACE,QAAA,OAAOP,KAAAA,IAASO,SAAAA;AAClB,IAAA,CAAA;IAEA,MAAMC,mBAAAA,GAAsB,CAACC,GAAAA,EAAKC,SAAAA,GAChCA,YAAYD,GAAAA,CAAIE,OAAO,CAAC,aAAA,EAAeD,SAAAA,CAAAA,GAAaD,GAAAA;IAEtD,MAAMG,iBAAAA,GAAoB,CAACC,QAAAA,EAAU,EAAEC,GAAG,EAAEC,WAAW,EAAEf,KAAK,EAAEU,SAAS,EAAE,GAAA;AACzE,QAAA,MAAMM,YAAAA,GAAeR,mBAAAA,CAAoBK,QAAAA,CAASI,aAAa,EAAEP,SAAAA,CAAAA;QACjE,MAAMQ,MAAAA,GAAS,IAAIC,eAAAA,CAAgB;YACjCC,SAAAA,EAAWN,GAAAA;YACXO,aAAAA,EAAe,MAAA;YACfC,YAAAA,EAAcP;AAClB,SAAA,CAAA;AAEE,QAAA,MAAMQ,cAAAA,GAAiBxB,WAAAA,CAAYC,KAAAA,EAAOa,QAAAA,CAASW,eAAe,CAAA;AAClE,QAAA,IAAID,cAAAA,EAAgB;YAClBL,MAAAA,CAAOO,GAAG,CAAC,OAAA,EAASF,cAAAA,CAAAA;AACxB,QAAA;AAEE,QAAA,IAAIV,SAASa,IAAI,KAAK,eAAe,OAAA,CAAQC,IAAI,CAACb,GAAAA,CAAAA,EAAM;AACtDI,YAAAA,MAAAA,CAAOU,MAAM,CAAC,WAAA,CAAA;YACdV,MAAAA,CAAOO,GAAG,CAAC,QAAA,EAAUX,GAAAA,CAAAA;AACrB,YAAA,IAAIS,cAAAA,EAAgB;AAClBL,gBAAAA,MAAAA,CAAOO,GAAG,CAAC,OAAA,EAASF,cAAAA,CAAeM,UAAU,CAAC,GAAA,EAAK,GAAA,CAAA,CAAA;AACzD,YAAA;AACA,QAAA;AAEE,QAAA,OAAO,GAAGb,YAAAA,CAAa,CAAC,EAAEE,MAAAA,CAAOY,QAAQ,EAAA,CAAA,CAAI;AAC/C,IAAA,CAAA;AAEA,IAAA,MAAMC,qBAAqB,OAAOC,QAAAA,GAAAA;AAChC,QAAA,MAAMC,cAAcD,QAAAA,CAASE,OAAO,CAACC,GAAG,CAAC,cAAA,CAAA,IAAmB,EAAA;QAC5D,IAAIF,WAAAA,CAAYG,QAAQ,CAAC,kBAAA,CAAA,EAAqB;AAC5C,YAAA,OAAOJ,SAASK,IAAI,EAAA;AACxB,QAAA;QACE,MAAMC,IAAAA,GAAO,MAAMN,QAAAA,CAASM,IAAI,EAAA;AAChC,QAAA,OAAOC,MAAAA,CAAOC,WAAW,CAAC,IAAIrB,eAAAA,CAAgBmB,IAAAA,CAAAA,CAAAA;AAChD,IAAA,CAAA;AAEA,IAAA,MAAMG,yBAAAA,GAA4B,OAChC5B,QAAAA,EACA,EAAEC,GAAG,EAAE4B,MAAM,EAAE3B,WAAW,EAAE4B,IAAI,EAAEjC,SAAS,
|
|
1
|
+
{"version":3,"file":"oauth2.mjs","sources":["../../../../server/src/utils/oauth-connect/oauth2.js"],"sourcesContent":["'use strict';\n\nconst crypto = require('node:crypto');\n\nconst formatScope = (scope, delimiter = ',') => {\n if (Array.isArray(scope)) {\n return scope.filter(Boolean).join(delimiter) || undefined;\n }\n return scope || undefined;\n};\n\nconst substituteSubdomain = (url, subdomain) =>\n subdomain ? url.replace('[subdomain]', subdomain) : url;\n\nconst buildAuthorizeUrl = (provider, { key, redirectUri, scope, subdomain }) => {\n const authorizeUrl = substituteSubdomain(provider.authorize_url, subdomain);\n const params = new URLSearchParams({\n client_id: key,\n response_type: 'code',\n redirect_uri: redirectUri,\n });\n\n const formattedScope = formatScope(scope, provider.scope_delimiter);\n if (formattedScope) {\n params.set('scope', formattedScope);\n }\n\n if (provider.name === 'instagram' && /^\\d+$/.test(key)) {\n params.delete('client_id');\n params.set('app_id', key);\n if (formattedScope) {\n params.set('scope', formattedScope.replaceAll(' ', ','));\n }\n }\n\n return `${authorizeUrl}?${params.toString()}`;\n};\n\nconst parseTokenResponse = async (response) => {\n const contentType = response.headers.get('content-type') || '';\n if (contentType.includes('application/json')) {\n return response.json();\n }\n const text = await response.text();\n return Object.fromEntries(new URLSearchParams(text));\n};\n\nconst exchangeAuthorizationCode = async (\n provider,\n { key, secret, redirectUri, code, subdomain }\n) => {\n const accessUrl = substituteSubdomain(provider.access_url, subdomain);\n const body = new URLSearchParams({\n grant_type: 'authorization_code',\n code,\n redirect_uri: redirectUri,\n client_id: key,\n client_secret: secret,\n });\n\n const headers = { 'Content-Type': 'application/x-www-form-urlencoded' };\n\n if (provider.token_endpoint_auth_method === 'client_secret_basic') {\n const credentials = Buffer.from(`${key}:${secret}`).toString('base64');\n headers.Authorization = `Basic ${credentials}`;\n body.delete('client_id');\n body.delete('client_secret');\n }\n\n if (provider.name === 'instagram' && /^\\d+$/.test(key)) {\n body.delete('client_id');\n body.delete('client_secret');\n body.set('app_id', key);\n body.set('app_secret', secret);\n }\n\n const response = await fetch(accessUrl, { method: 'POST', headers, body });\n const output = await parseTokenResponse(response);\n\n if (!response.ok) {\n throw new Error(\n output.error_description || output.error || `Token exchange failed (${response.status})`\n );\n }\n\n return output;\n};\n\nconst tokensToQueryPayload = (provider, tokenResponse) => {\n const data = { raw: tokenResponse };\n\n if (provider.oauth === 1) {\n if (tokenResponse.oauth_token) {\n data.access_token = tokenResponse.oauth_token;\n }\n if (tokenResponse.oauth_token_secret) {\n data.access_secret = tokenResponse.oauth_token_secret;\n }\n return data;\n }\n\n if (tokenResponse.id_token) {\n data.id_token = tokenResponse.id_token;\n }\n if (tokenResponse.access_token) {\n data.access_token = tokenResponse.access_token;\n }\n if (tokenResponse.refresh_token) {\n data.refresh_token = tokenResponse.refresh_token;\n }\n\n return data;\n};\n\nconst generateState = () => crypto.randomBytes(20).toString('hex');\n\nmodule.exports = {\n buildAuthorizeUrl,\n exchangeAuthorizationCode,\n tokensToQueryPayload,\n generateState,\n substituteSubdomain,\n};\n"],"names":["crypto","require$$0","formatScope","scope","delimiter","Array","isArray","filter","Boolean","join","undefined","substituteSubdomain","url","subdomain","replace","buildAuthorizeUrl","provider","key","redirectUri","authorizeUrl","authorize_url","params","URLSearchParams","client_id","response_type","redirect_uri","formattedScope","scope_delimiter","set","name","test","delete","replaceAll","toString","parseTokenResponse","response","contentType","headers","get","includes","json","text","Object","fromEntries","exchangeAuthorizationCode","secret","code","accessUrl","access_url","body","grant_type","client_secret","token_endpoint_auth_method","credentials","Buffer","from","Authorization","fetch","method","output","ok","Error","error_description","error","status","tokensToQueryPayload","tokenResponse","data","raw","oauth","oauth_token","access_token","oauth_token_secret","access_secret","id_token","refresh_token","generateState","randomBytes","oauth2"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-http.js","sources":["../../../server/src/utils/provider-http.js"],"sourcesContent":["'use strict';\n\nconst fetchJson = async (url, options = {}) => {\n const response = await fetch(url, options);\n const contentType = response.headers.get('content-type') || '';\n\n let body;\n if (contentType.includes('application/json')) {\n body = await response.json();\n } else {\n const text = await response.text();\n try {\n body = JSON.parse(text);\n } catch {\n body = text;\n }\n }\n\n if (!response.ok) {\n const message =\n typeof body === 'object' && body !== null\n ? body.error_description || body.error || body.message\n : body;\n throw new Error(message || `HTTP ${response.status}`);\n }\n\n return { body };\n};\n\nconst bearerGet = (url, accessToken, { headers = {}, qs = {} } = {}) => {\n const target = new URL(url);\n Object.entries(qs).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n target.searchParams.set(key, String(value));\n }\n });\n\n return fetchJson(target, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n ...headers,\n },\n });\n};\n\nmodule.exports = {\n fetchJson,\n bearerGet,\n};\n"],"names":["fetchJson","url","options","response","fetch","contentType","headers","get","body","includes","json","text","JSON","parse","ok","message","error_description","error","Error","status","bearerGet","accessToken","qs","target","URL","Object","entries","forEach","key","value","undefined","searchParams","set","String","Authorization","providerHttp"],"mappings":";;;;;;;AAEA,IAAA,MAAMA,SAAAA,GAAY,OAAOC,GAAAA,EAAKC,OAAAA,GAAU,EAAE,GAAA;QACxC,MAAMC,QAAAA,GAAW,MAAMC,KAAAA,CAAMH,GAAAA,EAAKC,OAAAA,CAAAA;AAClC,QAAA,MAAMG,cAAcF,QAAAA,CAASG,OAAO,CAACC,GAAG,CAAC,cAAA,CAAA,IAAmB,EAAA;QAE5D,IAAIC,IAAAA;QACJ,IAAIH,WAAAA,CAAYI,QAAQ,CAAC,kBAAA,CAAA,EAAqB;YAC5CD,IAAAA,GAAO,MAAML,SAASO,IAAI,EAAA;QAC9B,CAAA,MAAS;YACL,MAAMC,IAAAA,GAAO,MAAMR,QAAAA,CAASQ,IAAI,EAAA;YAChC,IAAI;gBACFH,IAAAA,GAAOI,IAAAA,CAAKC,KAAK,CAACF,IAAAA,CAAAA;AACxB,YAAA,CAAA,CAAM,OAAM;gBACNH,IAAAA,GAAOG,IAAAA;AACb,YAAA;AACA,QAAA;QAEE,IAAI,CAACR,QAAAA,CAASW,EAAE,EAAE;AAChB,YAAA,MAAMC,OAAAA,GACJ,OAAOP,IAAAA,KAAS,QAAA,IAAYA,SAAS,IAAA,GACjCA,IAAAA,CAAKQ,iBAAiB,IAAIR,IAAAA,CAAKS,KAAK,IAAIT,IAAAA,CAAKO,
|
|
1
|
+
{"version":3,"file":"provider-http.js","sources":["../../../server/src/utils/provider-http.js"],"sourcesContent":["'use strict';\n\nconst fetchJson = async (url, options = {}) => {\n const response = await fetch(url, options);\n const contentType = response.headers.get('content-type') || '';\n\n let body;\n if (contentType.includes('application/json')) {\n body = await response.json();\n } else {\n const text = await response.text();\n try {\n body = JSON.parse(text);\n } catch {\n body = text;\n }\n }\n\n if (!response.ok) {\n const message =\n typeof body === 'object' && body !== null\n ? body.error_description || body.error || body.message\n : body;\n throw new Error(message || `HTTP ${response.status}`);\n }\n\n return { body };\n};\n\nconst bearerGet = (url, accessToken, { headers = {}, qs = {} } = {}) => {\n const target = new URL(url);\n Object.entries(qs).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n target.searchParams.set(key, String(value));\n }\n });\n\n return fetchJson(target, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n ...headers,\n },\n });\n};\n\nmodule.exports = {\n fetchJson,\n bearerGet,\n};\n"],"names":["fetchJson","url","options","response","fetch","contentType","headers","get","body","includes","json","text","JSON","parse","ok","message","error_description","error","Error","status","bearerGet","accessToken","qs","target","URL","Object","entries","forEach","key","value","undefined","searchParams","set","String","Authorization","providerHttp"],"mappings":";;;;;;;AAEA,IAAA,MAAMA,SAAAA,GAAY,OAAOC,GAAAA,EAAKC,OAAAA,GAAU,EAAE,GAAA;QACxC,MAAMC,QAAAA,GAAW,MAAMC,KAAAA,CAAMH,GAAAA,EAAKC,OAAAA,CAAAA;AAClC,QAAA,MAAMG,cAAcF,QAAAA,CAASG,OAAO,CAACC,GAAG,CAAC,cAAA,CAAA,IAAmB,EAAA;QAE5D,IAAIC,IAAAA;QACJ,IAAIH,WAAAA,CAAYI,QAAQ,CAAC,kBAAA,CAAA,EAAqB;YAC5CD,IAAAA,GAAO,MAAML,SAASO,IAAI,EAAA;QAC9B,CAAA,MAAS;YACL,MAAMC,IAAAA,GAAO,MAAMR,QAAAA,CAASQ,IAAI,EAAA;YAChC,IAAI;gBACFH,IAAAA,GAAOI,IAAAA,CAAKC,KAAK,CAACF,IAAAA,CAAAA;AACxB,YAAA,CAAA,CAAM,OAAM;gBACNH,IAAAA,GAAOG,IAAAA;AACb,YAAA;AACA,QAAA;QAEE,IAAI,CAACR,QAAAA,CAASW,EAAE,EAAE;AAChB,YAAA,MAAMC,OAAAA,GACJ,OAAOP,IAAAA,KAAS,QAAA,IAAYA,SAAS,IAAA,GACjCA,IAAAA,CAAKQ,iBAAiB,IAAIR,IAAAA,CAAKS,KAAK,IAAIT,IAAAA,CAAKO,OAAA,GAC7CP,IAAAA;YACN,MAAM,IAAIU,MAAMH,OAAAA,IAAW,CAAC,KAAK,EAAEZ,QAAAA,CAASgB,MAAM,CAAA,CAAE,CAAA;AACxD,QAAA;QAEE,OAAO;AAAEX,YAAAA;AAAI,SAAA;AACf,IAAA,CAAA;AAEA,IAAA,MAAMY,SAAAA,GAAY,CAACnB,GAAAA,EAAKoB,WAAAA,EAAa,EAAEf,OAAAA,GAAU,EAAE,EAAEgB,KAAK,EAAE,EAAE,GAAG,EAAE,GAAA;QACjE,MAAMC,MAAAA,GAAS,IAAIC,GAAAA,CAAIvB,GAAAA,CAAAA;QACvBwB,MAAAA,CAAOC,OAAO,CAACJ,EAAAA,CAAAA,CAAIK,OAAO,CAAC,CAAC,CAACC,KAAKC,KAAAA,CAAM,GAAA;YACtC,IAAIA,KAAAA,KAAUC,SAAAA,IAAaD,KAAAA,KAAU,IAAA,EAAM;AACzCN,gBAAAA,MAAAA,CAAOQ,YAAY,CAACC,GAAG,CAACJ,KAAKK,MAAAA,CAAOJ,KAAAA,CAAAA,CAAAA;AAC1C,YAAA;AACA,QAAA,CAAA,CAAA;AAEE,QAAA,OAAO7B,UAAUuB,MAAAA,EAAQ;YACvBjB,OAAAA,EAAS;gBACP4B,aAAAA,EAAe,CAAC,OAAO,EAAEb,WAAAA,CAAAA,CAAa;AACtC,gBAAA,GAAGf;AACT;AACA,SAAA,CAAA;AACA,IAAA,CAAA;IAEA6B,YAAAA,GAAiB;AACfnC,QAAAA,SAAAA;AACAoB,QAAAA;AACF,KAAA;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-http.mjs","sources":["../../../server/src/utils/provider-http.js"],"sourcesContent":["'use strict';\n\nconst fetchJson = async (url, options = {}) => {\n const response = await fetch(url, options);\n const contentType = response.headers.get('content-type') || '';\n\n let body;\n if (contentType.includes('application/json')) {\n body = await response.json();\n } else {\n const text = await response.text();\n try {\n body = JSON.parse(text);\n } catch {\n body = text;\n }\n }\n\n if (!response.ok) {\n const message =\n typeof body === 'object' && body !== null\n ? body.error_description || body.error || body.message\n : body;\n throw new Error(message || `HTTP ${response.status}`);\n }\n\n return { body };\n};\n\nconst bearerGet = (url, accessToken, { headers = {}, qs = {} } = {}) => {\n const target = new URL(url);\n Object.entries(qs).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n target.searchParams.set(key, String(value));\n }\n });\n\n return fetchJson(target, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n ...headers,\n },\n });\n};\n\nmodule.exports = {\n fetchJson,\n bearerGet,\n};\n"],"names":["fetchJson","url","options","response","fetch","contentType","headers","get","body","includes","json","text","JSON","parse","ok","message","error_description","error","Error","status","bearerGet","accessToken","qs","target","URL","Object","entries","forEach","key","value","undefined","searchParams","set","String","Authorization","providerHttp"],"mappings":";;;;;AAEA,IAAA,MAAMA,SAAAA,GAAY,OAAOC,GAAAA,EAAKC,OAAAA,GAAU,EAAE,GAAA;QACxC,MAAMC,QAAAA,GAAW,MAAMC,KAAAA,CAAMH,GAAAA,EAAKC,OAAAA,CAAAA;AAClC,QAAA,MAAMG,cAAcF,QAAAA,CAASG,OAAO,CAACC,GAAG,CAAC,cAAA,CAAA,IAAmB,EAAA;QAE5D,IAAIC,IAAAA;QACJ,IAAIH,WAAAA,CAAYI,QAAQ,CAAC,kBAAA,CAAA,EAAqB;YAC5CD,IAAAA,GAAO,MAAML,SAASO,IAAI,EAAA;QAC9B,CAAA,MAAS;YACL,MAAMC,IAAAA,GAAO,MAAMR,QAAAA,CAASQ,IAAI,EAAA;YAChC,IAAI;gBACFH,IAAAA,GAAOI,IAAAA,CAAKC,KAAK,CAACF,IAAAA,CAAAA;AACxB,YAAA,CAAA,CAAM,OAAM;gBACNH,IAAAA,GAAOG,IAAAA;AACb,YAAA;AACA,QAAA;QAEE,IAAI,CAACR,QAAAA,CAASW,EAAE,EAAE;AAChB,YAAA,MAAMC,OAAAA,GACJ,OAAOP,IAAAA,KAAS,QAAA,IAAYA,SAAS,IAAA,GACjCA,IAAAA,CAAKQ,iBAAiB,IAAIR,IAAAA,CAAKS,KAAK,IAAIT,IAAAA,CAAKO,
|
|
1
|
+
{"version":3,"file":"provider-http.mjs","sources":["../../../server/src/utils/provider-http.js"],"sourcesContent":["'use strict';\n\nconst fetchJson = async (url, options = {}) => {\n const response = await fetch(url, options);\n const contentType = response.headers.get('content-type') || '';\n\n let body;\n if (contentType.includes('application/json')) {\n body = await response.json();\n } else {\n const text = await response.text();\n try {\n body = JSON.parse(text);\n } catch {\n body = text;\n }\n }\n\n if (!response.ok) {\n const message =\n typeof body === 'object' && body !== null\n ? body.error_description || body.error || body.message\n : body;\n throw new Error(message || `HTTP ${response.status}`);\n }\n\n return { body };\n};\n\nconst bearerGet = (url, accessToken, { headers = {}, qs = {} } = {}) => {\n const target = new URL(url);\n Object.entries(qs).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n target.searchParams.set(key, String(value));\n }\n });\n\n return fetchJson(target, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n ...headers,\n },\n });\n};\n\nmodule.exports = {\n fetchJson,\n bearerGet,\n};\n"],"names":["fetchJson","url","options","response","fetch","contentType","headers","get","body","includes","json","text","JSON","parse","ok","message","error_description","error","Error","status","bearerGet","accessToken","qs","target","URL","Object","entries","forEach","key","value","undefined","searchParams","set","String","Authorization","providerHttp"],"mappings":";;;;;AAEA,IAAA,MAAMA,SAAAA,GAAY,OAAOC,GAAAA,EAAKC,OAAAA,GAAU,EAAE,GAAA;QACxC,MAAMC,QAAAA,GAAW,MAAMC,KAAAA,CAAMH,GAAAA,EAAKC,OAAAA,CAAAA;AAClC,QAAA,MAAMG,cAAcF,QAAAA,CAASG,OAAO,CAACC,GAAG,CAAC,cAAA,CAAA,IAAmB,EAAA;QAE5D,IAAIC,IAAAA;QACJ,IAAIH,WAAAA,CAAYI,QAAQ,CAAC,kBAAA,CAAA,EAAqB;YAC5CD,IAAAA,GAAO,MAAML,SAASO,IAAI,EAAA;QAC9B,CAAA,MAAS;YACL,MAAMC,IAAAA,GAAO,MAAMR,QAAAA,CAASQ,IAAI,EAAA;YAChC,IAAI;gBACFH,IAAAA,GAAOI,IAAAA,CAAKC,KAAK,CAACF,IAAAA,CAAAA;AACxB,YAAA,CAAA,CAAM,OAAM;gBACNH,IAAAA,GAAOG,IAAAA;AACb,YAAA;AACA,QAAA;QAEE,IAAI,CAACR,QAAAA,CAASW,EAAE,EAAE;AAChB,YAAA,MAAMC,OAAAA,GACJ,OAAOP,IAAAA,KAAS,QAAA,IAAYA,SAAS,IAAA,GACjCA,IAAAA,CAAKQ,iBAAiB,IAAIR,IAAAA,CAAKS,KAAK,IAAIT,IAAAA,CAAKO,OAAA,GAC7CP,IAAAA;YACN,MAAM,IAAIU,MAAMH,OAAAA,IAAW,CAAC,KAAK,EAAEZ,QAAAA,CAASgB,MAAM,CAAA,CAAE,CAAA;AACxD,QAAA;QAEE,OAAO;AAAEX,YAAAA;AAAI,SAAA;AACf,IAAA,CAAA;AAEA,IAAA,MAAMY,SAAAA,GAAY,CAACnB,GAAAA,EAAKoB,WAAAA,EAAa,EAAEf,OAAAA,GAAU,EAAE,EAAEgB,KAAK,EAAE,EAAE,GAAG,EAAE,GAAA;QACjE,MAAMC,MAAAA,GAAS,IAAIC,GAAAA,CAAIvB,GAAAA,CAAAA;QACvBwB,MAAAA,CAAOC,OAAO,CAACJ,EAAAA,CAAAA,CAAIK,OAAO,CAAC,CAAC,CAACC,KAAKC,KAAAA,CAAM,GAAA;YACtC,IAAIA,KAAAA,KAAUC,SAAAA,IAAaD,KAAAA,KAAU,IAAA,EAAM;AACzCN,gBAAAA,MAAAA,CAAOQ,YAAY,CAACC,GAAG,CAACJ,KAAKK,MAAAA,CAAOJ,KAAAA,CAAAA,CAAAA;AAC1C,YAAA;AACA,QAAA,CAAA,CAAA;AAEE,QAAA,OAAO7B,UAAUuB,MAAAA,EAAQ;YACvBjB,OAAAA,EAAS;gBACP4B,aAAAA,EAAe,CAAC,OAAO,EAAEb,WAAAA,CAAAA,CAAa;AACtC,gBAAA,GAAGf;AACT;AACA,SAAA,CAAA;AACA,IAAA,CAAA;IAEA6B,YAAAA,GAAiB;AACfnC,QAAAA,SAAAA;AACAoB,QAAAA;AACF,KAAA;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify-jwt-with-jwks.js","sources":["../../../server/src/utils/verify-jwt-with-jwks.js"],"sourcesContent":["'use strict';\n\nconst crypto = require('node:crypto');\nconst jwt = require('jsonwebtoken');\n\nconst jwkToKeyObject = (jwk) => crypto.createPublicKey({ key: jwk, format: 'jwk' });\n\nconst verifyJwtWithJwks = async ({ idToken, jwksUrl }) => {\n const decoded = jwt.decode(idToken, { complete: true });\n\n if (!decoded?.header?.kid || !decoded.payload) {\n throw new Error('The provided token is not valid');\n }\n\n const response = await fetch(jwksUrl.toString());\n if (!response.ok) {\n throw new Error('There was an error verifying the token');\n }\n\n const jwk = await response.json();\n const key = jwk.keys?.find(({ kid }) => kid === decoded.header.kid);\n\n if (!key) {\n throw new Error('There was an error verifying the token');\n }\n\n const publicKey = jwkToKeyObject(key);\n\n return new Promise((resolve, reject) => {\n jwt.verify(idToken, publicKey, { algorithms: ['RS256'] }, (err, tokenPayload) => {\n if (err) {\n reject(new Error('There was an error verifying the token'));\n return;\n }\n resolve(tokenPayload);\n });\n });\n};\n\nmodule.exports = {\n jwkToKeyObject,\n verifyJwtWithJwks,\n};\n"],"names":["crypto","require$$0","jwt","require$$1","jwkToKeyObject","jwk","createPublicKey","key","format","verifyJwtWithJwks","idToken","jwksUrl","decoded","decode","complete","header","kid","payload","Error","response","fetch","toString","ok","json","keys","find","publicKey","Promise","resolve","reject","verify","algorithms","err","tokenPayload","verifyJwtWithJwks_1"],"mappings":";;;;;;;;;;;;;;AAEA,IAAA,MAAMA,MAAAA,GAASC,uCAAAA,EAAAA;AACf,IAAA,MAAMC,GAAAA,GAAMC,2BAAAA;AAEZ,IAAA,MAAMC,cAAAA,GAAiB,CAACC,GAAAA,GAAQL,MAAAA,CAAOM,eAAe,CAAC;YAAEC,GAAAA,EAAKF,GAAAA;YAAKG,MAAAA,EAAQ
|
|
1
|
+
{"version":3,"file":"verify-jwt-with-jwks.js","sources":["../../../server/src/utils/verify-jwt-with-jwks.js"],"sourcesContent":["'use strict';\n\nconst crypto = require('node:crypto');\nconst jwt = require('jsonwebtoken');\n\nconst jwkToKeyObject = (jwk) => crypto.createPublicKey({ key: jwk, format: 'jwk' });\n\nconst verifyJwtWithJwks = async ({ idToken, jwksUrl }) => {\n const decoded = jwt.decode(idToken, { complete: true });\n\n if (!decoded?.header?.kid || !decoded.payload) {\n throw new Error('The provided token is not valid');\n }\n\n const response = await fetch(jwksUrl.toString());\n if (!response.ok) {\n throw new Error('There was an error verifying the token');\n }\n\n const jwk = await response.json();\n const key = jwk.keys?.find(({ kid }) => kid === decoded.header.kid);\n\n if (!key) {\n throw new Error('There was an error verifying the token');\n }\n\n const publicKey = jwkToKeyObject(key);\n\n return new Promise((resolve, reject) => {\n jwt.verify(idToken, publicKey, { algorithms: ['RS256'] }, (err, tokenPayload) => {\n if (err) {\n reject(new Error('There was an error verifying the token'));\n return;\n }\n resolve(tokenPayload);\n });\n });\n};\n\nmodule.exports = {\n jwkToKeyObject,\n verifyJwtWithJwks,\n};\n"],"names":["crypto","require$$0","jwt","require$$1","jwkToKeyObject","jwk","createPublicKey","key","format","verifyJwtWithJwks","idToken","jwksUrl","decoded","decode","complete","header","kid","payload","Error","response","fetch","toString","ok","json","keys","find","publicKey","Promise","resolve","reject","verify","algorithms","err","tokenPayload","verifyJwtWithJwks_1"],"mappings":";;;;;;;;;;;;;;AAEA,IAAA,MAAMA,MAAAA,GAASC,uCAAAA,EAAAA;AACf,IAAA,MAAMC,GAAAA,GAAMC,2BAAAA;AAEZ,IAAA,MAAMC,cAAAA,GAAiB,CAACC,GAAAA,GAAQL,MAAAA,CAAOM,eAAe,CAAC;YAAEC,GAAAA,EAAKF,GAAAA;YAAKG,MAAAA,EAAQ;;AAE3E,IAAA,MAAMC,oBAAoB,OAAO,EAAEC,OAAO,EAAEC,OAAO,EAAE,GAAA;AACnD,QAAA,MAAMC,OAAAA,GAAUV,GAAAA,CAAIW,MAAM,CAACH,OAAAA,EAAS;YAAEI,QAAAA,EAAU;;AAEhD,QAAA,IAAI,CAACF,OAAAA,EAASG,MAAAA,EAAQC,OAAO,CAACJ,OAAAA,CAAQK,OAAO,EAAE;AAC7C,YAAA,MAAM,IAAIC,KAAAA,CAAM,iCAAA,CAAA;AACpB,QAAA;AAEE,QAAA,MAAMC,QAAAA,GAAW,MAAMC,KAAAA,CAAMT,OAAAA,CAAQU,QAAQ,EAAA,CAAA;QAC7C,IAAI,CAACF,QAAAA,CAASG,EAAE,EAAE;AAChB,YAAA,MAAM,IAAIJ,KAAAA,CAAM,wCAAA,CAAA;AACpB,QAAA;QAEE,MAAMb,GAAAA,GAAM,MAAMc,QAAAA,CAASI,IAAI,EAAA;AAC/B,QAAA,MAAMhB,GAAAA,GAAMF,GAAAA,CAAImB,IAAI,EAAEC,KAAK,CAAC,EAAET,GAAG,EAAE,GAAKA,GAAAA,KAAQJ,OAAAA,CAAQG,MAAM,CAACC,GAAG,CAAA;AAElE,QAAA,IAAI,CAACT,GAAAA,EAAK;AACR,YAAA,MAAM,IAAIW,KAAAA,CAAM,wCAAA,CAAA;AACpB,QAAA;AAEE,QAAA,MAAMQ,YAAYtB,cAAAA,CAAeG,GAAAA,CAAAA;QAEjC,OAAO,IAAIoB,OAAAA,CAAQ,CAACC,OAAAA,EAASC,MAAAA,GAAAA;YAC3B3B,GAAAA,CAAI4B,MAAM,CAACpB,OAAAA,EAASgB,SAAAA,EAAW;gBAAEK,UAAAA,EAAY;AAAC,oBAAA;AAAQ;AAAA,aAAA,EAAI,CAACC,GAAAA,EAAKC,YAAAA,GAAAA;AAC9D,gBAAA,IAAID,GAAAA,EAAK;AACPH,oBAAAA,MAAAA,CAAO,IAAIX,KAAAA,CAAM,wCAAA,CAAA,CAAA;AACjB,oBAAA;AACR,gBAAA;gBACMU,OAAAA,CAAQK,YAAAA,CAAAA;AACd,YAAA,CAAA,CAAA;AACA,QAAA,CAAA,CAAA;AACA,IAAA,CAAA;IAEAC,mBAAAA,GAAiB;AACf9B,QAAAA,cAAAA;AACAK,QAAAA;AACF,KAAA;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify-jwt-with-jwks.mjs","sources":["../../../server/src/utils/verify-jwt-with-jwks.js"],"sourcesContent":["'use strict';\n\nconst crypto = require('node:crypto');\nconst jwt = require('jsonwebtoken');\n\nconst jwkToKeyObject = (jwk) => crypto.createPublicKey({ key: jwk, format: 'jwk' });\n\nconst verifyJwtWithJwks = async ({ idToken, jwksUrl }) => {\n const decoded = jwt.decode(idToken, { complete: true });\n\n if (!decoded?.header?.kid || !decoded.payload) {\n throw new Error('The provided token is not valid');\n }\n\n const response = await fetch(jwksUrl.toString());\n if (!response.ok) {\n throw new Error('There was an error verifying the token');\n }\n\n const jwk = await response.json();\n const key = jwk.keys?.find(({ kid }) => kid === decoded.header.kid);\n\n if (!key) {\n throw new Error('There was an error verifying the token');\n }\n\n const publicKey = jwkToKeyObject(key);\n\n return new Promise((resolve, reject) => {\n jwt.verify(idToken, publicKey, { algorithms: ['RS256'] }, (err, tokenPayload) => {\n if (err) {\n reject(new Error('There was an error verifying the token'));\n return;\n }\n resolve(tokenPayload);\n });\n });\n};\n\nmodule.exports = {\n jwkToKeyObject,\n verifyJwtWithJwks,\n};\n"],"names":["crypto","require$$0","jwt","require$$1","jwkToKeyObject","jwk","createPublicKey","key","format","verifyJwtWithJwks","idToken","jwksUrl","decoded","decode","complete","header","kid","payload","Error","response","fetch","toString","ok","json","keys","find","publicKey","Promise","resolve","reject","verify","algorithms","err","tokenPayload","verifyJwtWithJwks_1"],"mappings":";;;;;;;;AAEA,IAAA,MAAMA,MAAAA,GAASC,SAAAA,EAAAA;AACf,IAAA,MAAMC,GAAAA,GAAMC,UAAAA;AAEZ,IAAA,MAAMC,cAAAA,GAAiB,CAACC,GAAAA,GAAQL,MAAAA,CAAOM,eAAe,CAAC;YAAEC,GAAAA,EAAKF,GAAAA;YAAKG,MAAAA,EAAQ
|
|
1
|
+
{"version":3,"file":"verify-jwt-with-jwks.mjs","sources":["../../../server/src/utils/verify-jwt-with-jwks.js"],"sourcesContent":["'use strict';\n\nconst crypto = require('node:crypto');\nconst jwt = require('jsonwebtoken');\n\nconst jwkToKeyObject = (jwk) => crypto.createPublicKey({ key: jwk, format: 'jwk' });\n\nconst verifyJwtWithJwks = async ({ idToken, jwksUrl }) => {\n const decoded = jwt.decode(idToken, { complete: true });\n\n if (!decoded?.header?.kid || !decoded.payload) {\n throw new Error('The provided token is not valid');\n }\n\n const response = await fetch(jwksUrl.toString());\n if (!response.ok) {\n throw new Error('There was an error verifying the token');\n }\n\n const jwk = await response.json();\n const key = jwk.keys?.find(({ kid }) => kid === decoded.header.kid);\n\n if (!key) {\n throw new Error('There was an error verifying the token');\n }\n\n const publicKey = jwkToKeyObject(key);\n\n return new Promise((resolve, reject) => {\n jwt.verify(idToken, publicKey, { algorithms: ['RS256'] }, (err, tokenPayload) => {\n if (err) {\n reject(new Error('There was an error verifying the token'));\n return;\n }\n resolve(tokenPayload);\n });\n });\n};\n\nmodule.exports = {\n jwkToKeyObject,\n verifyJwtWithJwks,\n};\n"],"names":["crypto","require$$0","jwt","require$$1","jwkToKeyObject","jwk","createPublicKey","key","format","verifyJwtWithJwks","idToken","jwksUrl","decoded","decode","complete","header","kid","payload","Error","response","fetch","toString","ok","json","keys","find","publicKey","Promise","resolve","reject","verify","algorithms","err","tokenPayload","verifyJwtWithJwks_1"],"mappings":";;;;;;;;AAEA,IAAA,MAAMA,MAAAA,GAASC,SAAAA,EAAAA;AACf,IAAA,MAAMC,GAAAA,GAAMC,UAAAA;AAEZ,IAAA,MAAMC,cAAAA,GAAiB,CAACC,GAAAA,GAAQL,MAAAA,CAAOM,eAAe,CAAC;YAAEC,GAAAA,EAAKF,GAAAA;YAAKG,MAAAA,EAAQ;;AAE3E,IAAA,MAAMC,oBAAoB,OAAO,EAAEC,OAAO,EAAEC,OAAO,EAAE,GAAA;AACnD,QAAA,MAAMC,OAAAA,GAAUV,GAAAA,CAAIW,MAAM,CAACH,OAAAA,EAAS;YAAEI,QAAAA,EAAU;;AAEhD,QAAA,IAAI,CAACF,OAAAA,EAASG,MAAAA,EAAQC,OAAO,CAACJ,OAAAA,CAAQK,OAAO,EAAE;AAC7C,YAAA,MAAM,IAAIC,KAAAA,CAAM,iCAAA,CAAA;AACpB,QAAA;AAEE,QAAA,MAAMC,QAAAA,GAAW,MAAMC,KAAAA,CAAMT,OAAAA,CAAQU,QAAQ,EAAA,CAAA;QAC7C,IAAI,CAACF,QAAAA,CAASG,EAAE,EAAE;AAChB,YAAA,MAAM,IAAIJ,KAAAA,CAAM,wCAAA,CAAA;AACpB,QAAA;QAEE,MAAMb,GAAAA,GAAM,MAAMc,QAAAA,CAASI,IAAI,EAAA;AAC/B,QAAA,MAAMhB,GAAAA,GAAMF,GAAAA,CAAImB,IAAI,EAAEC,KAAK,CAAC,EAAET,GAAG,EAAE,GAAKA,GAAAA,KAAQJ,OAAAA,CAAQG,MAAM,CAACC,GAAG,CAAA;AAElE,QAAA,IAAI,CAACT,GAAAA,EAAK;AACR,YAAA,MAAM,IAAIW,KAAAA,CAAM,wCAAA,CAAA;AACpB,QAAA;AAEE,QAAA,MAAMQ,YAAYtB,cAAAA,CAAeG,GAAAA,CAAAA;QAEjC,OAAO,IAAIoB,OAAAA,CAAQ,CAACC,OAAAA,EAASC,MAAAA,GAAAA;YAC3B3B,GAAAA,CAAI4B,MAAM,CAACpB,OAAAA,EAASgB,SAAAA,EAAW;gBAAEK,UAAAA,EAAY;AAAC,oBAAA;AAAQ;AAAA,aAAA,EAAI,CAACC,GAAAA,EAAKC,YAAAA,GAAAA;AAC9D,gBAAA,IAAID,GAAAA,EAAK;AACPH,oBAAAA,MAAAA,CAAO,IAAIX,KAAAA,CAAM,wCAAA,CAAA,CAAA;AACjB,oBAAA;AACR,gBAAA;gBACMU,OAAAA,CAAQK,YAAAA,CAAAA;AACd,YAAA,CAAA,CAAA;AACA,QAAA,CAAA,CAAA;AACA,IAAA,CAAA;IAEAC,mBAAAA,GAAiB;AACf9B,QAAAA,cAAAA;AACAK,QAAAA;AACF,KAAA;;;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@strapi/plugin-users-permissions",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.52.0",
|
|
4
4
|
"description": "Protect your API with a full-authentication process based on JWT",
|
|
5
5
|
"homepage": "https://strapi.io",
|
|
6
6
|
"bugs": {
|
|
@@ -53,9 +53,9 @@
|
|
|
53
53
|
"watch": "run -T rollup -c -w"
|
|
54
54
|
},
|
|
55
55
|
"dependencies": {
|
|
56
|
-
"@strapi/design-system": "2.2.
|
|
57
|
-
"@strapi/icons": "2.2.
|
|
58
|
-
"@strapi/utils": "5.
|
|
56
|
+
"@strapi/design-system": "2.2.4",
|
|
57
|
+
"@strapi/icons": "2.2.4",
|
|
58
|
+
"@strapi/utils": "5.52.0",
|
|
59
59
|
"bcryptjs": "2.4.3",
|
|
60
60
|
"formik": "2.4.9",
|
|
61
61
|
"immer": "9.0.21",
|
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
"zod": "3.25.76"
|
|
73
73
|
},
|
|
74
74
|
"devDependencies": {
|
|
75
|
-
"@strapi/strapi": "5.
|
|
75
|
+
"@strapi/strapi": "5.52.0",
|
|
76
76
|
"@testing-library/dom": "10.4.1",
|
|
77
77
|
"@testing-library/jest-dom": "6.9.1",
|
|
78
78
|
"@testing-library/react": "16.3.2",
|