UNPKG

wikibase-edit

Version:

Edit Wikibase from NodeJS

67 lines 2.66 kB
import { newError } from '../error.js'; import { stringifyQuery } from '../utils.js'; import { getJson } from './get_json.js'; import { getSignatureHeaders } from './oauth.js'; const contentType = 'application/x-www-form-urlencoded'; export function getFinalTokenFactory(config) { return async function getFinalToken(loginCookies) { const { instanceApiEndpoint, credentials, userAgent } = config; const oauthTokens = 'oauth' in credentials ? credentials.oauth : undefined; const query = { action: 'query', meta: 'tokens', type: 'csrf', format: 'json' }; const url = `${instanceApiEndpoint}?${stringifyQuery(query)}`; const params = { headers: { 'user-agent': userAgent, 'content-type': contentType, }, }; if (oauthTokens) { const signatureHeaders = getSignatureHeaders({ url, method: 'GET', oauthTokens, }); Object.assign(params.headers, signatureHeaders); } else { params.headers.cookie = loginCookies; } const body = await getJson(url, params); return parseTokens(loginCookies, instanceApiEndpoint, body); }; } async function parseTokens(loginCookies, instanceApiEndpoint, body) { const { error, query } = body; if (error) throw formatError(error, body, instanceApiEndpoint); if (!query?.tokens) { throw newError('could not get tokens', { body }); } const { csrftoken } = query.tokens; if (csrftoken.length < 40) { throw newError('invalid csrf token', { loginCookies, body }); } return { token: csrftoken, cookie: loginCookies, }; } function formatError(error, body, instanceApiEndpoint) { const err = newError(`${instanceApiEndpoint} error response: ${error.info}`, { body }); Object.assign(err, error); if (error.code === 'mwoauth-invalid-authorization' && error['*'] != null) { const domainMatch = error['*'].match(/(https?:\/\/.*\/w\/api.php)/); if (domainMatch != null && domainMatch[1] !== instanceApiEndpoint) { const domain = domainMatch[1]; err.message += `\n\n***This might be caused by non-matching domains*** between the server domain:\t${domain} and the domain in config:\t${instanceApiEndpoint}\n`; // @ts-expect-error err.context.domain = domain; // @ts-expect-error err.context.instanceApiEndpoint = instanceApiEndpoint; } } return err; } //# sourceMappingURL=get_final_token.js.map