PHP 8.2.30
Preview: token.js Size: 6.20 KB
/proc/thread-self/root/proc/thread-self/root/opt/alt/alt-nodejs9/root/usr/lib/node_modules/npm/lib/token.js

'use strict'
const profile = require('npm-profile')
const npm = require('./npm.js')
const output = require('./utils/output.js')
const Table = require('cli-table2')
const Bluebird = require('bluebird')
const isCidrV4 = require('is-cidr').isCidrV4
const isCidrV6 = require('is-cidr').isCidrV6
const readUserInfo = require('./utils/read-user-info.js')
const ansistyles = require('ansistyles')
const log = require('npmlog')
const pulseTillDone = require('./utils/pulse-till-done.js')

module.exports = token

token.usage =
  'npm token list\n' +
  'npm token revoke <tokenKey>\n' +
  'npm token create [--read-only] [--cidr=list]\n'

token.subcommands = ['list', 'revoke', 'create']

token.completion = function (opts, cb) {
  var argv = opts.conf.argv.remain

  switch (argv[2]) {
    case 'list':
    case 'revoke':
    case 'create':
      return cb(null, [])
    default:
      return cb(new Error(argv[2] + ' not recognized'))
  }
}

function withCb (prom, cb) {
  prom.then((value) => cb(null, value), cb)
}

function token (args, cb) {
  log.gauge.show('token')
  if (args.length === 0) return withCb(list([]), cb)
  switch (args[0]) {
    case 'list':
    case 'ls':
      withCb(list(), cb)
      break
    case 'delete':
    case 'revoke':
    case 'remove':
    case 'rm':
      withCb(rm(args.slice(1)), cb)
      break
    case 'create':
      withCb(create(args.slice(1)), cb)
      break
    default:
      cb(new Error('Unknown profile command: ' + args[0]))
  }
}

function generateTokenIds (tokens, minLength) {
  const byId = {}
  tokens.forEach((token) => {
    token.id = token.key
    for (let ii = minLength; ii < token.key.length; ++ii) {
      if (!tokens.some((ot) => ot !== token && ot.key.slice(0, ii) === token.key.slice(0, ii))) {
        token.id = token.key.slice(0, ii)
        break
      }
    }
    byId[token.id] = token
  })
  return byId
}

function config () {
  const conf = {
    json: npm.config.get('json'),
    parseable: npm.config.get('parseable'),
    registry: npm.config.get('registry'),
    otp: npm.config.get('otp')
  }
  conf.auth = npm.config.getCredentialsByURI(conf.registry)
  if (conf.otp) conf.auth.otp = conf.otp
  return conf
}

function list (args) {
  const conf = config()
  log.info('token', 'getting list')
  return pulseTillDone.withPromise(profile.listTokens(conf)).then((tokens) => {
    if (conf.json) {
      output(JSON.stringify(tokens, null, 2))
      return
    } else if (conf.parseable) {
      output(['key', 'token', 'created', 'readonly', 'CIDR whitelist'].join('\t'))
      tokens.forEach((token) => {
        output([
          token.key,
          token.token,
          token.created,
          token.readonly ? 'true' : 'false',
          token.cidr_whitelist ? token.cidr_whitelist.join(',') : ''
        ].join('\t'))
      })
      return
    }
    generateTokenIds(tokens, 6)
    const idWidth = tokens.reduce((acc, token) => Math.max(acc, token.id.length), 0)
    const table = new Table({
      head: ['id', 'token', 'created', 'readonly', 'CIDR whitelist'],
      colWidths: [Math.max(idWidth, 2) + 2, 9, 12, 10]
    })
    tokens.forEach((token) => {
      table.push([
        token.id,
        token.token + '…',
        String(token.created).slice(0, 10),
        token.readonly ? 'yes' : 'no',
        token.cidr_whitelist ? token.cidr_whitelist.join(', ') : ''
      ])
    })
    output(table.toString())
  })
}

function rm (args) {
  if (args.length === 0) {
    throw new Error('npm token revoke <tokenKey>')
  }
  const conf = config()
  const toRemove = []
  const progress = log.newItem('removing tokens', toRemove.length)
  progress.info('token', 'getting existing list')
  return pulseTillDone.withPromise(profile.listTokens(conf).then((tokens) => {
    args.forEach((id) => {
      const matches = tokens.filter((token) => token.key.indexOf(id) === 0)
      if (matches.length === 1) {
        toRemove.push(matches[0].key)
      } else if (matches.length > 1) {
        throw new Error(`Token ID "${id}" was ambiguous, a new token may have been created since you last ran \`npm-profile token list\`.`)
      } else {
        const tokenMatches = tokens.filter((token) => id.indexOf(token.token) === 0)
        if (tokenMatches === 0) {
          throw new Error(`Unknown token id or value "${id}".`)
        }
        toRemove.push(id)
      }
    })
    return Bluebird.map(toRemove, (key) => {
      progress.info('token', 'removing', key)
      profile.removeToken(key, conf).then(() => profile.completeWork(1))
    })
  })).then(() => {
    if (conf.json) {
      output(JSON.stringify(toRemove))
    } else if (conf.parseable) {
      output(toRemove.join('\t'))
    } else {
      output('Removed ' + toRemove.length + ' token' + (toRemove.length !== 1 ? 's' : ''))
    }
  })
}

function create (args) {
  const conf = config()
  const cidr = npm.config.get('cidr')
  const readonly = npm.config.get('read-only')

  const validCIDR = validateCIDRList(cidr)
  return readUserInfo.password().then((password) => {
    log.info('token', 'creating')
    return profile.createToken(password, readonly, validCIDR, conf).catch((ex) => {
      if (ex.code !== 'EOTP') throw ex
      log.info('token', 'failed because it requires OTP')
      return readUserInfo.otp('Authenticator provided OTP:').then((otp) => {
        conf.auth.otp = otp
        log.info('token', 'creating with OTP')
        return pulseTillDone.withPromise(profile.createToken(password, readonly, validCIDR, conf))
      })
    })
  }).then((result) => {
    delete result.key
    delete result.updated
    if (conf.json) {
      output(JSON.stringify(result))
    } else if (conf.parseable) {
      Object.keys(result).forEach((k) => output(k + '\t' + result[k]))
    } else {
      const table = new Table()
      Object.keys(result).forEach((k) => table.push({[ansistyles.bright(k)]: String(result[k])}))
      output(table.toString())
    }
  })
}

function validateCIDR (cidr) {
  if (isCidrV6(cidr)) {
    throw new Error('CIDR whitelist can only contain IPv4 addresses, ' + cidr + ' is IPv6')
  }
  if (!isCidrV4(cidr)) {
    throw new Error('CIDR whitelist contains invalid CIDR entry: ' + cidr)
  }
}

function validateCIDRList (cidrs) {
  const list = Array.isArray(cidrs) ? cidrs : cidrs ? cidrs.split(/,\s*/) : []
  list.forEach(validateCIDR)
  return list
}

Directory Contents

Dirs: 6 × Files: 60

Name Size Perms Modified Actions
auth DIR
- drwxr-xr-x 2024-03-03 22:42:04
Edit Download
config DIR
- drwxr-xr-x 2024-03-03 22:42:04
Edit Download
doctor DIR
- drwxr-xr-x 2024-03-03 22:42:04
Edit Download
install DIR
- drwxr-xr-x 2024-03-03 22:42:04
Edit Download
search DIR
- drwxr-xr-x 2024-03-03 22:42:04
Edit Download
utils DIR
- drwxr-xr-x 2024-03-03 22:42:04
Edit Download
3.23 KB lrw-r--r-- 2021-09-28 11:28:10
Edit Download
1.28 KB lrw-r--r-- 2021-09-28 11:28:10
Edit Download
515 B lrw-r--r-- 2021-09-28 11:28:10
Edit Download
879 B lrw-r--r-- 2021-09-28 11:28:10
Edit Download
4.45 KB lrw-r--r-- 2021-09-28 11:28:10
Edit Download
4.43 KB lrw-r--r-- 2021-09-28 11:28:10
Edit Download
7.06 KB lrw-r--r-- 2021-09-28 11:28:10
Edit Download
7.22 KB lrw-r--r-- 2021-09-28 11:28:10
Edit Download
4.83 KB lrw-r--r-- 2021-09-28 11:28:09
Edit Download
1.41 KB lrw-r--r-- 2021-09-28 11:28:10
Edit Download
3.67 KB lrw-r--r-- 2021-09-28 11:28:09
Edit Download
1.05 KB lrw-r--r-- 2021-09-28 11:28:10
Edit Download
3.97 KB lrw-r--r-- 2021-09-28 11:28:09
Edit Download
985 B lrw-r--r-- 2021-09-28 11:28:10
Edit Download
1.63 KB lrw-r--r-- 2021-09-28 11:28:09
Edit Download
3.80 KB lrw-r--r-- 2021-09-28 11:28:10
Edit Download
1.77 KB lrw-r--r-- 2021-09-28 11:28:10
Edit Download
235 B lrw-r--r-- 2021-09-28 11:28:10
Edit Download
5.65 KB lrw-r--r-- 2021-09-28 11:28:10
Edit Download
6.32 KB lrw-r--r-- 2021-09-28 11:28:09
Edit Download
1.26 KB lrw-r--r-- 2021-09-28 11:28:10
Edit Download
507 B lrw-r--r-- 2021-09-28 11:28:09
Edit Download
32.16 KB lrw-r--r-- 2021-09-28 11:28:10
Edit Download
5.56 KB lrw-r--r-- 2021-09-28 11:28:09
Edit Download
1.10 KB lrw-r--r-- 2021-09-28 11:28:10
Edit Download
15.83 KB lrw-r--r-- 2021-09-28 11:28:10
Edit Download
13.30 KB lrw-r--r-- 2021-09-28 11:28:09
Edit Download
12.15 KB lrw-r--r-- 2021-09-28 11:28:10
Edit Download
7.55 KB lrw-r--r-- 2021-09-28 11:28:09
Edit Download
7.21 KB lrw-r--r-- 2021-09-28 11:28:10
Edit Download
688 B lrw-r--r-- 2021-09-28 11:28:10
Edit Download
330 B lrw-r--r-- 2021-09-28 11:28:10
Edit Download
10.61 KB lrw-r--r-- 2021-09-28 11:28:10
Edit Download
2.14 KB lrw-r--r-- 2021-09-28 11:28:10
Edit Download
6.10 KB lrw-r--r-- 2021-09-28 11:28:10
Edit Download
2.09 KB lrw-r--r-- 2021-09-28 11:28:09
Edit Download
1.45 KB lrw-r--r-- 2021-09-28 11:28:09
Edit Download
64 B lrw-r--r-- 2021-09-28 11:28:10
Edit Download
316 B lrw-r--r-- 2021-09-28 11:28:10
Edit Download
5.18 KB lrw-r--r-- 2021-09-28 11:28:10
Edit Download
3.15 KB lrw-r--r-- 2021-09-28 11:28:10
Edit Download
276 B lrw-r--r-- 2021-09-28 11:28:09
Edit Download
7.76 KB lrw-r--r-- 2021-09-28 11:28:10
Edit Download
1.17 KB lrw-r--r-- 2021-09-28 11:28:10
Edit Download
1.10 KB lrw-r--r-- 2021-09-28 11:28:10
Edit Download
62 B lrw-r--r-- 2021-09-28 11:28:10
Edit Download
61 B lrw-r--r-- 2021-09-28 11:28:10
Edit Download
509 B lrw-r--r-- 2021-09-28 11:28:09
Edit Download
1.41 KB lrw-r--r-- 2021-09-28 11:28:11
Edit Download
324 B lrw-r--r-- 2021-09-28 11:28:09
Edit Download
6.20 KB lrw-r--r-- 2021-09-28 11:28:09
Edit Download
4.11 KB lrw-r--r-- 2021-09-28 11:28:10
Edit Download
2.22 KB lrw-r--r-- 2021-09-28 11:28:11
Edit Download
3.55 KB lrw-r--r-- 2021-09-28 11:28:10
Edit Download
2.18 KB lrw-r--r-- 2021-09-28 11:28:11
Edit Download
9.10 KB lrw-r--r-- 2021-09-28 11:28:10
Edit Download
9.26 KB lrw-r--r-- 2021-09-28 11:28:09
Edit Download
4.01 KB lrw-r--r-- 2021-09-28 11:28:10
Edit Download
1.42 KB lrw-r--r-- 2021-09-28 11:28:10
Edit Download
1.57 KB lrw-r--r-- 2021-09-28 11:28:10
Edit Download

If ZipArchive is unavailable, a .tar will be created (no compression).