shell bypass 403
曾与蒿藜同雨露,한때 잡초와 쑥과 함께 비와 이슬을 나누던 곳이 이제는 소나무와 삼나무와 함께 서리와 눈을 견뎌내고 있다.终随松柏到冰霜.かつては雑草やヨモギと共に雨や露を分かち合っていたが、今では松やヒノキと共に霜や雪に耐えている。曾与蒿藜同雨露,Once sharing rain and dew with weeds and wormwood, now enduring frost and snow with pines and cypresses.终随松柏到冰霜.曾与蒿藜同雨露한때 잡초와 쑥과 함께 비와 이슬을 나누던 곳이 이제는 소나무와 삼나무와 함께 서리와 눈을 견뎌내고 있다.,终随松柏到冰霜.譖セ荳手珍阯懷酔髮ィ髴イ�檎サ磯囂譚セ譟丞芦蜀ー髴�曾与蒿藜同雨露,鏇句笌钂胯棞鍚岄洦闇诧紝缁堥殢鏉炬煆鍒板啺闇�终随松柏到冰霜.曾与蒿藜同雨露,한때 잡초와 쑥과 함께 비와 이슬을 나누던 곳이 이제는 소나무와 삼나무와 함께 서리와 눈을 견뎌내고 있다.终随松柏到冰霜.曾与蒿藜同雨露,终随松柏到冰霜.
/* eslint-disable standard/no-callback-literal */
module.exports = config
var log = require('npmlog')
var npm = require('./npm.js')
var npmconf = require('./config/core.js')
var fs = require('graceful-fs')
var writeFileAtomic = require('write-file-atomic')
var types = npmconf.defs.types
var ini = require('ini')
var editor = require('editor')
var os = require('os')
var path = require('path')
var mkdirp = require('mkdirp')
var umask = require('./utils/umask')
var usage = require('./utils/usage')
var output = require('./utils/output')
var noProgressTillDone = require('./utils/no-progress-while-running').tillDone
config.usage = usage(
'config',
'npm config set <key> <value>' +
'\nnpm config get [<key>]' +
'\nnpm config delete <key>' +
'\nnpm config list [--json]' +
'\nnpm config edit' +
'\nnpm set <key> <value>' +
'\nnpm get [<key>]'
)
config.completion = function (opts, cb) {
var argv = opts.conf.argv.remain
if (argv[1] !== 'config') argv.unshift('config')
if (argv.length === 2) {
var cmds = ['get', 'set', 'delete', 'ls', 'rm', 'edit']
if (opts.partialWord !== 'l') cmds.push('list')
return cb(null, cmds)
}
var action = argv[2]
switch (action) {
case 'set':
// todo: complete with valid values, if possible.
if (argv.length > 3) return cb(null, [])
// fallthrough
/* eslint no-fallthrough:0 */
case 'get':
case 'delete':
case 'rm':
return cb(null, Object.keys(types))
case 'edit':
case 'list':
case 'ls':
return cb(null, [])
default:
return cb(null, [])
}
}
// npm config set key value
// npm config get key
// npm config list
function config (args, cb) {
var action = args.shift()
switch (action) {
case 'set':
return set(args[0], args[1], cb)
case 'get':
return get(args[0], cb)
case 'delete':
case 'rm':
case 'del':
return del(args[0], cb)
case 'list':
case 'ls':
return npm.config.get('json') ? listJson(cb) : list(cb)
case 'edit':
return edit(cb)
default:
return unknown(action, cb)
}
}
function edit (cb) {
var e = npm.config.get('editor')
var which = npm.config.get('global') ? 'global' : 'user'
var f = npm.config.get(which + 'config')
if (!e) return cb(new Error('No EDITOR config or environ set.'))
npm.config.save(which, function (er) {
if (er) return cb(er)
fs.readFile(f, 'utf8', function (er, data) {
if (er) data = ''
data = [
';;;;',
'; npm ' + (npm.config.get('global')
? 'globalconfig' : 'userconfig') + ' file',
'; this is a simple ini-formatted file',
'; lines that start with semi-colons are comments.',
'; read `npm help config` for help on the various options',
';;;;',
'',
data
].concat([
';;;;',
'; all options with default values',
';;;;'
]).concat(Object.keys(npmconf.defaults).reduce(function (arr, key) {
var obj = {}
obj[key] = npmconf.defaults[key]
if (key === 'logstream') return arr
return arr.concat(
ini.stringify(obj)
.replace(/\n$/m, '')
.replace(/^/g, '; ')
.replace(/\n/g, '\n; ')
.split('\n'))
}, []))
.concat([''])
.join(os.EOL)
mkdirp(path.dirname(f), function (er) {
if (er) return cb(er)
writeFileAtomic(
f,
data,
function (er) {
if (er) return cb(er)
editor(f, { editor: e }, noProgressTillDone(cb))
}
)
})
})
})
}
function del (key, cb) {
if (!key) return cb(new Error('no key provided'))
var where = npm.config.get('global') ? 'global' : 'user'
npm.config.del(key, where)
npm.config.save(where, cb)
}
function set (key, val, cb) {
if (key === undefined) {
return unknown('', cb)
}
if (val === undefined) {
if (key.indexOf('=') !== -1) {
var k = key.split('=')
key = k.shift()
val = k.join('=')
} else {
val = ''
}
}
key = key.trim()
val = val.trim()
log.info('config', 'set %j %j', key, val)
var where = npm.config.get('global') ? 'global' : 'user'
if (key.match(/umask/)) val = umask.fromString(val)
npm.config.set(key, val, where)
npm.config.save(where, cb)
}
function get (key, cb) {
if (!key) return list(cb)
if (!publicVar(key)) {
return cb(new Error('---sekretz---'))
}
var val = npm.config.get(key)
if (key.match(/umask/)) val = umask.toString(val)
output(val)
cb()
}
function sort (a, b) {
return a > b ? 1 : -1
}
function publicVar (k) {
return !(k.charAt(0) === '_' || k.indexOf(':_') !== -1)
}
function getKeys (data) {
return Object.keys(data).filter(publicVar).sort(sort)
}
function listJson (cb) {
const publicConf = npm.config.keys.reduce((publicConf, k) => {
var value = npm.config.get(k)
if (publicVar(k) &&
// argv is not really config, it's command config
k !== 'argv' &&
// logstream is a Stream, and would otherwise produce circular refs
k !== 'logstream') publicConf[k] = value
return publicConf
}, {})
output(JSON.stringify(publicConf, null, 2))
return cb()
}
function listFromSource (title, conf, long) {
var confKeys = getKeys(conf)
var msg = ''
if (confKeys.length) {
msg += '; ' + title + '\n'
confKeys.forEach(function (k) {
var val = JSON.stringify(conf[k])
if (conf[k] !== npm.config.get(k)) {
if (!long) return
msg += '; ' + k + ' = ' + val + ' (overridden)\n'
} else msg += k + ' = ' + val + '\n'
})
msg += '\n'
}
return msg
}
function list (cb) {
var msg = ''
var long = npm.config.get('long')
var cli = npm.config.sources.cli.data
var cliKeys = getKeys(cli)
if (cliKeys.length) {
msg += '; cli configs\n'
cliKeys.forEach(function (k) {
if (cli[k] && typeof cli[k] === 'object') return
if (k === 'argv') return
msg += k + ' = ' + JSON.stringify(cli[k]) + '\n'
})
msg += '\n'
}
// env configs
msg += listFromSource('environment configs', npm.config.sources.env.data, long)
// project config file
var project = npm.config.sources.project
msg += listFromSource('project config ' + project.path, project.data, long)
// user config file
msg += listFromSource('userconfig ' + npm.config.get('userconfig'), npm.config.sources.user.data, long)
// global config file
msg += listFromSource('globalconfig ' + npm.config.get('globalconfig'), npm.config.sources.global.data, long)
// builtin config file
var builtin = npm.config.sources.builtin || {}
if (builtin && builtin.data) {
msg += listFromSource('builtin config ' + builtin.path, builtin.data, long)
}
// only show defaults if --long
if (!long) {
msg += '; node bin location = ' + process.execPath + '\n' +
'; cwd = ' + process.cwd() + '\n' +
'; HOME = ' + process.env.HOME + '\n' +
'; "npm config ls -l" to show all defaults.\n'
output(msg)
return cb()
}
var defaults = npmconf.defaults
var defKeys = getKeys(defaults)
msg += '; default values\n'
defKeys.forEach(function (k) {
if (defaults[k] && typeof defaults[k] === 'object') return
var val = JSON.stringify(defaults[k])
if (defaults[k] !== npm.config.get(k)) {
msg += '; ' + k + ' = ' + val + ' (overridden)\n'
} else msg += k + ' = ' + val + '\n'
})
msg += '\n'
output(msg)
return cb()
}
function unknown (action, cb) {
cb('Usage:\n' + config.usage)
}