mirror of
https://code.forgejo.org/actions/setup-node.git
synced 2024-11-24 20:20:56 -05:00
40 lines
1.2 KiB
JavaScript
40 lines
1.2 KiB
JavaScript
|
module.exports = authenticationRequestError
|
||
|
|
||
|
const { RequestError } = require('@octokit/request-error')
|
||
|
|
||
|
function authenticationRequestError (state, error, options) {
|
||
|
/* istanbul ignore next */
|
||
|
if (!error.headers) throw error
|
||
|
|
||
|
const otpRequired = /required/.test(error.headers['x-github-otp'] || '')
|
||
|
// handle "2FA required" error only
|
||
|
if (error.status !== 401 || !otpRequired) {
|
||
|
throw error
|
||
|
}
|
||
|
|
||
|
if (error.status === 401 && otpRequired && error.request && error.request.headers['x-github-otp']) {
|
||
|
throw new RequestError('Invalid one-time password for two-factor authentication', 401, {
|
||
|
headers: error.headers,
|
||
|
request: options
|
||
|
})
|
||
|
}
|
||
|
|
||
|
if (typeof state.auth.on2fa !== 'function') {
|
||
|
throw new RequestError('2FA required, but options.on2fa is not a function. See https://github.com/octokit/rest.js#authentication', 401, {
|
||
|
headers: error.headers,
|
||
|
request: options
|
||
|
})
|
||
|
}
|
||
|
|
||
|
return Promise.resolve()
|
||
|
.then(() => {
|
||
|
return state.auth.on2fa()
|
||
|
})
|
||
|
.then((oneTimePassword) => {
|
||
|
const newOptions = Object.assign(options, {
|
||
|
headers: Object.assign({ 'x-github-otp': oneTimePassword }, options.headers)
|
||
|
})
|
||
|
return state.octokit.request(newOptions)
|
||
|
})
|
||
|
}
|