$65 GRAYBYTE WORDPRESS FILE MANAGER $22

SERVER : premium201.web-hosting.com #1 SMP Wed Mar 26 12:08:09 UTC 2025
SERVER IP : 104.21.15.130 | ADMIN IP 216.73.217.83
OPTIONS : CRL = ON | WGT = ON | SDO = OFF | PKEX = OFF
DEACTIVATED : NONE

/opt/alt/alt-nodejs24/root/usr/lib/node_modules/npm/lib/commands/

HOME
Current File : /opt/alt/alt-nodejs24/root/usr/lib/node_modules/npm/lib/commands//profile.js
const { inspect } = require('node:util')
const { URL } = require('node:url')
const { log, output } = require('proc-log')
const { get, set, createToken } = require('npm-profile')
const qrcodeTerminal = require('qrcode-terminal')
const { otplease } = require('../utils/auth.js')
const readUserInfo = require('../utils/read-user-info.js')
const BaseCommand = require('../base-cmd.js')

const qrcode = url =>
  new Promise((resolve) => qrcodeTerminal.generate(url, resolve))

const knownProfileKeys = [
  'name',
  'email',
  'two-factor auth',
  'fullname',
  'homepage',
  'freenode',
  'twitter',
  'github',
  'created',
  'updated',
]

const writableProfileKeys = [
  'email',
  'password',
  'fullname',
  'homepage',
  'freenode',
  'twitter',
  'github',
]

class Profile extends BaseCommand {
  static description = 'Change settings on your registry profile'
  static name = 'profile'
  static usage = [
    'enable-2fa [auth-only|auth-and-writes]',
    'disable-2fa',
    'get [<key>]',
    'set <key> <value>',
  ]

  static params = [
    'registry',
    'json',
    'parseable',
    'otp',
  ]

  static async completion (opts) {
    var argv = opts.conf.argv.remain

    if (!argv[2]) {
      return ['enable-2fa', 'disable-2fa', 'get', 'set']
    }

    switch (argv[2]) {
      case 'enable-2fa':
      case 'enable-tfa':
        return ['auth-and-writes', 'auth-only']

      case 'disable-2fa':
      case 'disable-tfa':
      case 'get':
      case 'set':
        return []
      default:
        throw new Error(argv[2] + ' not recognized')
    }
  }

  async exec (args) {
    if (args.length === 0) {
      throw this.usageError()
    }

    const [subcmd, ...opts] = args

    switch (subcmd) {
      case 'enable-2fa':
      case 'enable-tfa':
      case 'enable2fa':
      case 'enabletfa':
        return this.enable2fa(opts)
      case 'disable-2fa':
      case 'disable-tfa':
      case 'disable2fa':
      case 'disabletfa':
        return this.disable2fa()
      case 'get':
        return this.get(opts)
      case 'set':
        return this.set(opts)
      default:
        throw new Error('Unknown profile command: ' + subcmd)
    }
  }

  async get (args) {
    const tfa = 'two-factor auth'
    const info = await get({ ...this.npm.flatOptions })

    if (!info.cidr_whitelist) {
      delete info.cidr_whitelist
    }

    if (this.npm.config.get('json')) {
      output.buffer(info)
      return
    }

    // clean up and format key/values for output
    const cleaned = {}
    for (const key of knownProfileKeys) {
      cleaned[key] = info[key] || ''
    }

    const unknownProfileKeys = Object.keys(info).filter((k) => !(k in cleaned))
    for (const key of unknownProfileKeys) {
      cleaned[key] = info[key] || ''
    }

    delete cleaned.tfa
    delete cleaned.email_verified
    cleaned.email += info.email_verified ? ' (verified)' : '(unverified)'

    if (info.tfa && !info.tfa.pending) {
      cleaned[tfa] = info.tfa.mode
    } else {
      cleaned[tfa] = 'disabled'
    }

    if (args.length) {
      const values = args // comma or space separated
        .join(',')
        .split(/,/)
        .filter((arg) => arg.trim() !== '')
        .map((arg) => cleaned[arg])
        .join('\t')
      output.standard(values)
    } else {
      if (this.npm.config.get('parseable')) {
        for (const key of Object.keys(info)) {
          if (key === 'tfa') {
            output.standard(`${key}\t${cleaned[tfa]}`)
          } else {
            output.standard(`${key}\t${info[key]}`)
          }
        }
      } else {
        for (const [key, value] of Object.entries(cleaned)) {
          output.standard(`${key}: ${value}`)
        }
      }
    }
  }

  async set (args) {
    const conf = { ...this.npm.flatOptions }
    const prop = (args[0] || '').toLowerCase().trim()

    let value = args.length > 1 ? args.slice(1).join(' ') : null

    const readPasswords = async () => {
      const newpassword = await readUserInfo.password('New password: ')
      const confirmedpassword = await readUserInfo.password('       Again:     ')

      if (newpassword !== confirmedpassword) {
        log.warn('profile', 'Passwords do not match, please try again.')
        return readPasswords()
      }

      return newpassword
    }

    if (prop !== 'password' && value === null) {
      throw new Error('npm profile set <prop> <value>')
    }

    if (prop === 'password' && value !== null) {
      throw new Error(
        'npm profile set password\n' +
        'Do not include your current or new passwords on the command line.')
    }

    if (writableProfileKeys.indexOf(prop) === -1) {
      throw new Error(`"${prop}" is not a property we can set. ` +
        `Valid properties are: ` + writableProfileKeys.join(', '))
    }

    if (prop === 'password') {
      const current = await readUserInfo.password('Current password: ')
      const newpassword = await readPasswords()

      value = { old: current, new: newpassword }
    }

    // FIXME: Work around to not clear everything other than what we're setting
    const user = await get(conf)
    const newUser = {}

    for (const key of writableProfileKeys) {
      newUser[key] = user[key]
    }

    newUser[prop] = value

    const result = await otplease(this.npm, conf, c => set(newUser, c))

    if (this.npm.config.get('json')) {
      output.buffer({ [prop]: result[prop] })
    } else if (this.npm.config.get('parseable')) {
      output.standard(prop + '\t' + result[prop])
    } else if (result[prop] != null) {
      output.standard('Set', prop, 'to', result[prop])
    } else {
      output.standard('Set', prop)
    }
  }

  async enable2fa (args) {
    const conf = { ...this.npm.flatOptions }

    if (args.length > 1) {
      throw new Error('npm profile enable-2fa [auth-and-writes|auth-only]')
    }

    const mode = args[0] || 'auth-and-writes'
    if (mode !== 'auth-only' && mode !== 'auth-and-writes') {
      throw new Error(
        `Invalid two-factor authentication mode "${mode}".\n` +
        'Valid modes are:\n' +
        '  auth-only - Require two-factor authentication only when logging in\n' +
        '  auth-and-writes - Require two-factor authentication when logging in ' +
        'AND when publishing'
      )
    }

    if (this.npm.config.get('json') || this.npm.config.get('parseable')) {
      throw new Error(
        'Enabling two-factor authentication is an interactive operation and ' +
        (this.npm.config.get('json') ? 'JSON' : 'parseable') + ' output mode is not available'
      )
    }

    const userInfo = await get(conf)

    if (!userInfo?.tfa?.pending && userInfo?.tfa?.mode === mode) {
      output.standard('Two factor authentication is already enabled and set to ' + mode)
      return
    }

    const info = {
      tfa: {
        mode,
      },
    }

    // if they're using legacy auth currently then we have to update them to a bearer token before continuing.
    const creds = this.npm.config.getCredentialsByURI(this.npm.config.get('registry'))
    const auth = {}

    if (creds.token) {
      auth.token = creds.token
    } else if (creds.username) {
      auth.basic = { username: creds.username, password: creds.password }
    } else if (creds.auth) {
      const basic = Buffer.from(creds.auth, 'base64').toString().split(':', 2)
      auth.basic = { username: basic[0], password: basic[1] }
    }

    if (!auth.basic && !auth.token) {
      throw new Error(
        'You need to be logged in to registry ' +
        `${this.npm.config.get('registry')} in order to enable 2fa`
      )
    }

    if (auth.basic) {
      log.info('profile', 'Updating authentication to bearer token')
      const result = await createToken(
        auth.basic.password, false, [], { ...this.npm.flatOptions }
      )

      if (!result.token) {
        throw new Error(`Your registry ${this.npm.config.get('registry')} does not seem to support bearer tokens. Bearer tokens are required for two-factor authentication.`)
      }

      this.npm.config.setCredentialsByURI(
        this.npm.config.get('registry'),
        { token: result.token }
      )
      await this.npm.config.save('user')
    }

    log.notice('profile', 'Enabling two factor authentication for ' + mode)
    const password = await readUserInfo.password()
    info.tfa.password = password

    if (userInfo && userInfo.tfa && userInfo.tfa.pending) {
      log.info('profile', 'Resetting two-factor authentication')
      await set({ tfa: { password, mode: 'disable' } }, conf)
    }

    log.info('profile', 'Setting two-factor authentication to ' + mode)
    const challenge = await otplease(this.npm, conf, o => set(info, o))

    if (challenge.tfa && challenge.tfa.mode) {
      output.standard('Two factor authentication mode changed to: ' + mode)
      return
    }

    const badResponse = typeof challenge.tfa !== 'string'
      || !/^otpauth:[/][/]/.test(challenge.tfa)
    if (badResponse) {
      throw new Error(`Unknown error enabling two-factor authentication. Expected otpauth URL, got: ${inspect(challenge.tfa)}`)
    }

    const otpauth = new URL(challenge.tfa)
    const secret = otpauth.searchParams.get('secret')
    const code = await qrcode(challenge.tfa)

    output.standard('Scan into your authenticator app:\n' + code + '\n Or enter code:', secret)

    const interactiveOTP = await readUserInfo.otp('And an OTP code from your authenticator: ')

    log.info('profile', 'Finalizing two-factor authentication')

    const result = await set({ tfa: [interactiveOTP] }, conf)

    output.standard('2FA successfully enabled. Below are your recovery codes, please print these out.')
    output.standard('You will need these to recover access to your account if you lose your authentication device.')

    for (const tfaCode of result.tfa) {
      output.standard('\t' + tfaCode)
    }
  }

  async disable2fa () {
    const opts = { ...this.npm.flatOptions }
    const info = await get(opts)

    if (!info.tfa || info.tfa.pending) {
      output.standard('Two factor authentication not enabled.')
      return
    }

    const password = await readUserInfo.password()

    log.info('profile', 'disabling tfa')
    await otplease(this.npm, opts, o => set({ tfa: { password: password, mode: 'disable' } }, o))

    if (this.npm.config.get('json')) {
      output.buffer({ tfa: false })
    } else if (this.npm.config.get('parseable')) {
      output.standard('tfa\tfalse')
    } else {
      output.standard('Two factor authentication disabled.')
    }
  }
}

module.exports = Profile

Current_dir [ NOT WRITEABLE ] Document_root [ NOT WRITEABLE ]


[ Back ]
NAME
SIZE
LAST TOUCH
USER
CAN-I?
FUNCTIONS
..
--
14 May 2026 8.36 AM
root / root
0755
trust
--
14 May 2026 8.36 AM
root / root
0755
access.js
6.165 KB
24 Apr 2026 3.56 PM
root / root
0644
adduser.js
1.29 KB
24 Apr 2026 3.56 PM
root / root
0644
audit.js
3.172 KB
24 Apr 2026 3.56 PM
root / root
0644
bugs.js
0.827 KB
24 Apr 2026 3.56 PM
root / root
0644
cache.js
11.479 KB
24 Apr 2026 3.56 PM
root / root
0644
ci.js
4.237 KB
24 Apr 2026 3.56 PM
root / root
0644
completion.js
10.825 KB
24 Apr 2026 3.56 PM
root / root
0644
config.js
11.478 KB
24 Apr 2026 3.56 PM
root / root
0644
dedupe.js
1.416 KB
24 Apr 2026 3.56 PM
root / root
0644
deprecate.js
2.43 KB
24 Apr 2026 3.56 PM
root / root
0644
diff.js
7.919 KB
24 Apr 2026 3.56 PM
root / root
0644
dist-tag.js
5.497 KB
24 Apr 2026 3.56 PM
root / root
0644
docs.js
0.438 KB
24 Apr 2026 3.56 PM
root / root
0644
doctor.js
9.986 KB
24 Apr 2026 3.56 PM
root / root
0644
edit.js
1.724 KB
24 Apr 2026 3.56 PM
root / root
0644
exec.js
3.394 KB
24 Apr 2026 3.56 PM
root / root
0644
explain.js
3.546 KB
24 Apr 2026 3.56 PM
root / root
0644
explore.js
2.107 KB
24 Apr 2026 3.56 PM
root / root
0644
find-dupes.js
0.564 KB
24 Apr 2026 3.56 PM
root / root
0644
fund.js
6.38 KB
24 Apr 2026 3.56 PM
root / root
0644
get.js
0.525 KB
24 Apr 2026 3.56 PM
root / root
0644
help-search.js
5.529 KB
24 Apr 2026 3.56 PM
root / root
0644
help.js
3.644 KB
24 Apr 2026 3.56 PM
root / root
0644
init.js
7.018 KB
24 Apr 2026 3.56 PM
root / root
0644
install-ci-test.js
0.301 KB
24 Apr 2026 3.56 PM
root / root
0644
install-test.js
0.296 KB
24 Apr 2026 3.56 PM
root / root
0644
install.js
5.099 KB
24 Apr 2026 3.56 PM
root / root
0644
link.js
5.238 KB
24 Apr 2026 3.56 PM
root / root
0644
ll.js
0.229 KB
24 Apr 2026 3.56 PM
root / root
0644
login.js
1.287 KB
24 Apr 2026 3.56 PM
root / root
0644
logout.js
1.419 KB
24 Apr 2026 3.56 PM
root / root
0644
ls.js
18.031 KB
24 Apr 2026 3.56 PM
root / root
0644
org.js
3.959 KB
24 Apr 2026 3.56 PM
root / root
0644
outdated.js
7.921 KB
24 Apr 2026 3.56 PM
root / root
0644
owner.js
5.951 KB
24 Apr 2026 3.56 PM
root / root
0644
pack.js
2.767 KB
24 Apr 2026 3.56 PM
root / root
0644
ping.js
0.853 KB
24 Apr 2026 3.56 PM
root / root
0644
pkg.js
3.581 KB
24 Apr 2026 3.56 PM
root / root
0644
prefix.js
0.302 KB
24 Apr 2026 3.56 PM
root / root
0644
profile.js
10.3 KB
24 Apr 2026 3.56 PM
root / root
0644
prune.js
0.752 KB
24 Apr 2026 3.56 PM
root / root
0644
publish.js
9.471 KB
24 Apr 2026 3.56 PM
root / root
0644
query.js
3.75 KB
24 Apr 2026 3.56 PM
root / root
0644
rebuild.js
2.15 KB
24 Apr 2026 3.56 PM
root / root
0644
repo.js
1.244 KB
24 Apr 2026 3.56 PM
root / root
0644
restart.js
0.296 KB
24 Apr 2026 3.56 PM
root / root
0644
root.js
0.288 KB
24 Apr 2026 3.56 PM
root / root
0644
run.js
6.267 KB
24 Apr 2026 3.56 PM
root / root
0644
sbom.js
4.471 KB
24 Apr 2026 3.56 PM
root / root
0644
search.js
1.833 KB
24 Apr 2026 3.56 PM
root / root
0644
set.js
0.617 KB
24 Apr 2026 3.56 PM
root / root
0644
shrinkwrap.js
2.628 KB
24 Apr 2026 3.56 PM
root / root
0644
star.js
1.875 KB
24 Apr 2026 3.56 PM
root / root
0644
stars.js
1.033 KB
24 Apr 2026 3.56 PM
root / root
0644
start.js
0.286 KB
24 Apr 2026 3.56 PM
root / root
0644
stop.js
0.281 KB
24 Apr 2026 3.56 PM
root / root
0644
team.js
4.332 KB
24 Apr 2026 3.56 PM
root / root
0644
test.js
0.281 KB
24 Apr 2026 3.56 PM
root / root
0644
token.js
7.962 KB
24 Apr 2026 3.56 PM
root / root
0644
undeprecate.js
0.295 KB
24 Apr 2026 3.56 PM
root / root
0644
uninstall.js
1.486 KB
24 Apr 2026 3.56 PM
root / root
0644
unpublish.js
5.242 KB
24 Apr 2026 3.56 PM
root / root
0644
unstar.js
0.179 KB
24 Apr 2026 3.56 PM
root / root
0644
update.js
1.692 KB
24 Apr 2026 3.56 PM
root / root
0644
version.js
3.536 KB
24 Apr 2026 3.56 PM
root / root
0644
view.js
13.479 KB
24 Apr 2026 3.56 PM
root / root
0644
whoami.js
0.515 KB
24 Apr 2026 3.56 PM
root / root
0644

GRAYBYTE WORDPRESS FILE MANAGER @ 2026 CONTACT ME
Static GIF Static GIF