fixes and admin data

This commit is contained in:
2021-02-09 18:30:17 +01:00
parent 9dd4d10396
commit 93bff025e9
73 changed files with 1638 additions and 2411 deletions

View File

@@ -2,6 +2,12 @@
All notable changes will be documented in this file.
## [4.2.0] - 2020-07-13
### Changes
- Add support for `NPM_CONFIG_USERCONFIG` environment variable (Ben Sorohan)
## [4.1.0] - 2020-01-17
### Changes

View File

@@ -1,6 +1,6 @@
# registry-auth-token
[![npm version](http://img.shields.io/npm/v/registry-auth-token.svg?style=flat-square)](http://browsenpm.org/package/registry-auth-token)[![Build Status](http://img.shields.io/travis/rexxars/registry-auth-token/master.svg?style=flat-square)](https://travis-ci.org/rexxars/registry-auth-token)
[![npm version](http://img.shields.io/npm/v/registry-auth-token.svg?style=flat-square)](http://browsenpm.org/package/registry-auth-token)[![Build Status](http://img.shields.io/travis/rexxars/registry-auth-token/main.svg?style=flat-square)](https://travis-ci.org/rexxars/registry-auth-token)
Get the auth token set for an npm registry from `.npmrc`. Also allows fetching the configured registry URL for a given npm scope.

View File

@@ -21,7 +21,9 @@ module.exports = function () {
options = arguments[0]
}
options = options || {}
options.npmrc = options.npmrc || require('rc')('npm', { registry: 'https://registry.npmjs.org/' })
options.npmrc = options.npmrc || require('rc')('npm', { registry: 'https://registry.npmjs.org/' }, {
config: process.env.npm_config_userconfig || process.env.NPM_CONFIG_USERCONFIG
})
checkUrl = checkUrl || options.npmrc.registry
return getRegistryAuthInfo(checkUrl, options) || getLegacyAuthInfo(options.npmrc)
}

View File

@@ -1,20 +1,50 @@
{
"name": "registry-auth-token",
"version": "4.1.1",
"description": "Get the auth token set for an npm registry (if any)",
"main": "index.js",
"scripts": {
"test": "mocha",
"posttest": "standard",
"coverage": "istanbul cover _mocha"
"_from": "registry-auth-token@^4.0.0",
"_id": "registry-auth-token@4.2.1",
"_inBundle": false,
"_integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==",
"_location": "/registry-auth-token",
"_phantomChildren": {},
"_requested": {
"type": "range",
"registry": true,
"raw": "registry-auth-token@^4.0.0",
"name": "registry-auth-token",
"escapedName": "registry-auth-token",
"rawSpec": "^4.0.0",
"saveSpec": null,
"fetchSpec": "^4.0.0"
},
"repository": {
"type": "git",
"url": "git+ssh://git@github.com/rexxars/registry-auth-token.git"
"_requiredBy": [
"/package-json"
],
"_resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz",
"_shasum": "6d7b4006441918972ccd5fedcd41dc322c79b250",
"_spec": "registry-auth-token@^4.0.0",
"_where": "C:\\Users\\Jonasz\\Desktop\\Menui\\menui_backend\\node_modules\\package-json",
"author": {
"name": "Espen Hovlandsdal",
"email": "espen@hovlandsdal.com"
},
"bugs": {
"url": "https://github.com/rexxars/registry-auth-token/issues"
},
"bundleDependencies": false,
"dependencies": {
"rc": "^1.2.8"
},
"deprecated": false,
"description": "Get the auth token set for an npm registry (if any)",
"devDependencies": {
"istanbul": "^0.4.2",
"mocha": "^6.1.4",
"require-uncached": "^1.0.2",
"standard": "^12.0.1"
},
"engines": {
"node": ">=6.0.0"
},
"homepage": "https://github.com/rexxars/registry-auth-token#readme",
"keywords": [
"npm",
"conf",
@@ -25,28 +55,22 @@
"token",
"authtoken"
],
"author": "Espen Hovlandsdal <espen@hovlandsdal.com>",
"license": "MIT",
"bugs": {
"url": "https://github.com/rexxars/registry-auth-token/issues"
"main": "index.js",
"name": "registry-auth-token",
"repository": {
"type": "git",
"url": "git+ssh://git@github.com/rexxars/registry-auth-token.git"
},
"homepage": "https://github.com/rexxars/registry-auth-token#readme",
"dependencies": {
"rc": "^1.2.8"
},
"devDependencies": {
"istanbul": "^0.4.2",
"mocha": "^6.1.4",
"require-uncached": "^1.0.2",
"standard": "^12.0.1"
"scripts": {
"coverage": "istanbul cover _mocha",
"posttest": "standard",
"test": "mocha"
},
"standard": {
"ignore": [
"coverage/**"
]
}
,"_resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.1.1.tgz"
,"_integrity": "sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA=="
,"_from": "registry-auth-token@4.1.1"
}
},
"version": "4.2.1"
}

View File

@@ -1,474 +0,0 @@
var fs = require('fs')
var path = require('path')
var mocha = require('mocha')
var assert = require('assert')
var requireUncached = require('require-uncached')
var npmRcPath = path.join(__dirname, '..', '.npmrc')
var afterEach = mocha.afterEach
var describe = mocha.describe
var it = mocha.it
var base64 = require('../base64')
var decodeBase64 = base64.decodeBase64
var encodeBase64 = base64.encodeBase64
/* eslint max-nested-callbacks: ["error", 4] */
describe('auth-token', function () {
afterEach(function (done) {
fs.unlink(npmRcPath, function () {
done()
})
})
it('should read global if no local is found', function () {
var getAuthToken = requireUncached('../index')
getAuthToken()
})
it('should return undefined if no auth token is given for registry', function (done) {
fs.writeFile(npmRcPath, 'registry=http://registry.npmjs.eu/', function (err) {
var getAuthToken = requireUncached('../index')
assert(!err, err)
assert(!getAuthToken())
done()
})
})
describe('legacy auth token', function () {
it('should return auth token if it is defined in the legacy way via the `_auth` key', function (done) {
var content = [
'_auth=foobar',
'registry=http://registry.foobar.eu/'
].join('\n')
fs.writeFile(npmRcPath, content, function (err) {
var getAuthToken = requireUncached('../index')
assert(!err, err)
assert.deepStrictEqual(getAuthToken(), { token: 'foobar', type: 'Basic' })
done()
})
})
it('should return legacy auth token defined by reference to an environment variable (with curly braces)', function (done) {
var environmentVariable = '__REGISTRY_AUTH_TOKEN_NPM_TOKEN__'
var content = [
'_auth=${' + environmentVariable + '}',
'registry=http://registry.foobar.eu/'
].join('\n')
process.env[environmentVariable] = 'foobar'
fs.writeFile(npmRcPath, content, function (err) {
var getAuthToken = requireUncached('../index')
assert(!err, err)
assert.deepStrictEqual(getAuthToken(), { token: 'foobar', type: 'Basic' })
delete process.env[environmentVariable]
done()
})
})
it('should return legacy auth token defined by reference to an environment variable (without curly braces)', function (done) {
var environmentVariable = '__REGISTRY_AUTH_TOKEN_NPM_TOKEN__'
var content = [
'_auth=$' + environmentVariable,
'registry=http://registry.foobar.eu/'
].join('\n')
process.env[environmentVariable] = 'foobar'
fs.writeFile(npmRcPath, content, function (err) {
var getAuthToken = requireUncached('../index')
assert(!err, err)
assert.deepStrictEqual(getAuthToken(), { token: 'foobar', type: 'Basic' })
delete process.env[environmentVariable]
done()
})
})
})
describe('bearer token', function () {
it('should return auth token if registry is defined', function (done) {
var content = [
'registry=http://registry.foobar.eu/',
'//registry.foobar.eu/:_authToken=foobar', ''
].join('\n')
fs.writeFile(npmRcPath, content, function (err) {
var getAuthToken = requireUncached('../index')
assert(!err, err)
assert.deepStrictEqual(getAuthToken(), { token: 'foobar', type: 'Bearer' })
done()
})
})
it('should use npmrc passed in', function (done) {
var content = [
'registry=http://registry.foobar.eu/',
'//registry.foobar.eu/:_authToken=foobar', ''
].join('\n')
fs.writeFile(npmRcPath, content, function (err) {
var getAuthToken = requireUncached('../index')
assert(!err, err)
const npmrc = {
'registry': 'http://registry.foobar.eu/',
'//registry.foobar.eu/:_authToken': 'qar'
}
assert.deepStrictEqual(getAuthToken({ npmrc: npmrc }), { token: 'qar', type: 'Bearer' })
done()
})
})
it('should return auth token if registry url has port specified', function (done) {
var content = [
'registry=http://localhost:8770/',
// before the patch this token was selected.
'//localhost/:_authToken=ohno',
'//localhost:8770/:_authToken=beepboop', ''
].join('\n')
fs.writeFile(npmRcPath, content, function (err) {
var getAuthToken = requireUncached('../index')
assert(!err, err)
assert.deepStrictEqual(getAuthToken(), { token: 'beepboop', type: 'Bearer' })
done()
})
})
it('should return auth token defined by reference to an environment variable (with curly braces)', function (done) {
var environmentVariable = '__REGISTRY_AUTH_TOKEN_NPM_TOKEN__'
var content = [
'registry=http://registry.foobar.cc/',
'//registry.foobar.cc/:_authToken=${' + environmentVariable + '}', ''
].join('\n')
process.env[environmentVariable] = 'foobar'
fs.writeFile(npmRcPath, content, function (err) {
var getAuthToken = requireUncached('../index')
assert(!err, err)
assert.deepStrictEqual(getAuthToken(), { token: 'foobar', type: 'Bearer' })
delete process.env[environmentVariable]
done()
})
})
it('should return auth token defined by reference to an environment variable (without curly braces)', function (done) {
var environmentVariable = '__REGISTRY_AUTH_TOKEN_NPM_TOKEN__'
var content = [
'registry=http://registry.foobar.cc/',
'//registry.foobar.cc/:_authToken=$' + environmentVariable, ''
].join('\n')
process.env[environmentVariable] = 'foobar'
fs.writeFile(npmRcPath, content, function (err) {
var getAuthToken = requireUncached('../index')
assert(!err, err)
assert.deepStrictEqual(getAuthToken(), { token: 'foobar', type: 'Bearer' })
delete process.env[environmentVariable]
done()
})
})
it('should try with and without a slash at the end of registry url', function (done) {
var content = [
'registry=http://registry.foobar.eu',
'//registry.foobar.eu:_authToken=barbaz', ''
].join('\n')
fs.writeFile(npmRcPath, content, function (err) {
var getAuthToken = requireUncached('../index')
assert(!err, err)
assert.deepStrictEqual(getAuthToken(), { token: 'barbaz', type: 'Bearer' })
done()
})
})
it('should fetch for the registry given (if defined)', function (done) {
var content = [
'//registry.foobar.eu:_authToken=barbaz',
'//registry.blah.foo:_authToken=whatev',
'//registry.last.thing:_authToken=yep', ''
].join('\n')
fs.writeFile(npmRcPath, content, function (err) {
var getAuthToken = requireUncached('../index')
assert(!err, err)
assert.deepStrictEqual(getAuthToken('//registry.blah.foo'), { token: 'whatev', type: 'Bearer' })
done()
})
})
it('recursively finds registries for deep url if option is set', function (done, undef) {
var opts = { recursive: true }
var content = [
'//registry.blah.com/foo:_authToken=whatev',
'//registry.blah.org/foo/bar:_authToken=recurseExactlyOneLevel',
'//registry.blah.edu/foo/bar/baz:_authToken=recurseNoLevel',
'//registry.blah.eu:_authToken=yep', ''
].join('\n')
fs.writeFile(npmRcPath, content, function (err) {
var getAuthToken = requireUncached('../index')
assert(!err, err)
assert.deepStrictEqual(getAuthToken('https://registry.blah.edu/foo/bar/baz', opts), { token: 'recurseNoLevel', type: 'Bearer' })
assert.deepStrictEqual(getAuthToken('https://registry.blah.org/foo/bar/baz', opts), { token: 'recurseExactlyOneLevel', type: 'Bearer' })
assert.deepStrictEqual(getAuthToken('https://registry.blah.com/foo/bar/baz', opts), { token: 'whatev', type: 'Bearer' })
assert.deepStrictEqual(getAuthToken('http://registry.blah.eu/what/ever', opts), { token: 'yep', type: 'Bearer' })
assert.deepStrictEqual(getAuthToken('http://registry.blah.eu//what/ever', opts), undefined, 'does not hang')
assert.strictEqual(getAuthToken('//some.registry', opts), undef)
done()
})
})
it('should try both with and without trailing slash', function (done) {
fs.writeFile(npmRcPath, '//registry.blah.com:_authToken=whatev', function (err) {
var getAuthToken = requireUncached('../index')
assert(!err, err)
assert.deepStrictEqual(getAuthToken('https://registry.blah.com'), { token: 'whatev', type: 'Bearer' })
done()
})
})
it('should prefer bearer token over basic token', function (done) {
var content = [
'registry=http://registry.foobar.eu/',
'registry=http://registry.foobar.eu/',
'//registry.foobar.eu/:_authToken=bearerToken',
'//registry.foobar.eu/:_password=' + encodeBase64('foobar'),
'//registry.foobar.eu/:username=foobar', ''
].join('\n')
fs.writeFile(npmRcPath, content, function (err) {
var getAuthToken = requireUncached('../index')
assert(!err, err)
assert.deepStrictEqual(getAuthToken('//registry.foobar.eu'), { token: 'bearerToken', type: 'Bearer' })
done()
})
})
it('"nerf darts" registry urls', function (done, undef) {
fs.writeFile(npmRcPath, '//contoso.pkgs.visualstudio.com/_packaging/MyFeed/npm/:_authToken=heider', function (err) {
var getAuthToken = requireUncached('../index')
assert(!err, err)
assert.deepStrictEqual(
getAuthToken('https://contoso.pkgs.visualstudio.com/_packaging/MyFeed/npm/registry'),
{ token: 'heider', type: 'Bearer' }
)
done()
})
})
})
describe('basic token', function () {
it('should return undefined if password or username are missing', function (done, undef) {
var content = [
'registry=http://registry.foobar.eu/',
'//registry.foobar.eu/:_password=' + encodeBase64('foobar'),
'//registry.foobar.com/:username=foobar', ''
].join('\n')
fs.writeFile(npmRcPath, content, function (err) {
var getAuthToken = requireUncached('../index')
assert(!err, err)
assert.strictEqual(getAuthToken('//registry.foobar.eu'), undef)
assert.strictEqual(getAuthToken('//registry.foobar.com'), undef)
done()
})
})
it('should return basic token if username and password are defined', function (done) {
var content = [
'registry=http://registry.foobar.eu/',
'//registry.foobar.eu/:_password=' + encodeBase64('foobar'),
'//registry.foobar.eu/:username=foobar', ''
].join('\n')
fs.writeFile(npmRcPath, content, function (err) {
var getAuthToken = requireUncached('../index')
assert(!err, err)
var token = getAuthToken()
assert.deepStrictEqual(token, {
token: 'Zm9vYmFyOmZvb2Jhcg==',
type: 'Basic',
username: 'foobar',
password: 'foobar'
})
assert.strictEqual(decodeBase64(token.token), 'foobar:foobar')
done()
})
})
it('should return basic token if _auth is base64 encoded', function (done) {
var content = [
'registry=http://registry.foobar.eu/',
'//registry.foobar.eu/:_auth=' + encodeBase64('foobar:foobar')
].join('\n')
fs.writeFile(npmRcPath, content, function (err) {
var getAuthToken = requireUncached('../index')
assert(!err, err)
var token = getAuthToken()
assert.deepStrictEqual(token, {
token: 'Zm9vYmFyOmZvb2Jhcg==',
type: 'Basic'
})
assert.strictEqual(decodeBase64(token.token), 'foobar:foobar')
done()
})
})
it('should return basic token if registry url has port specified', function (done) {
var content = [
'registry=http://localhost:8770/',
// before the patch this token was selected.
'//localhost/:_authToken=ohno',
'//localhost:8770/:_password=' + encodeBase64('foobar'),
'//localhost:8770/:username=foobar', ''
].join('\n')
fs.writeFile(npmRcPath, content, function (err) {
var getAuthToken = requireUncached('../index')
assert(!err, err)
var token = getAuthToken()
assert.deepStrictEqual(token, {
token: 'Zm9vYmFyOmZvb2Jhcg==',
type: 'Basic',
username: 'foobar',
password: 'foobar'
})
assert.strictEqual(decodeBase64(token.token), 'foobar:foobar')
done()
})
})
it('should return password defined by reference to an environment variable (with curly braces)', function (done) {
var environmentVariable = '__REGISTRY_PASSWORD__'
var content = [
'registry=http://registry.foobar.cc/',
'//registry.foobar.cc/:username=username',
'//registry.foobar.cc/:_password=${' + environmentVariable + '}', ''
].join('\n')
process.env[environmentVariable] = encodeBase64('password')
fs.writeFile(npmRcPath, content, function (err) {
var getAuthToken = requireUncached('../index')
assert(!err, err)
var token = getAuthToken()
assert.deepStrictEqual(token, {
type: 'Basic',
username: 'username',
password: 'password',
token: 'dXNlcm5hbWU6cGFzc3dvcmQ='
})
assert.strictEqual(decodeBase64(token.token), 'username:password')
delete process.env[environmentVariable]
done()
})
})
it('should return password defined by reference to an environment variable (without curly braces)', function (done) {
var environmentVariable = '__REGISTRY_PASSWORD__'
var content = [
'registry=http://registry.foobar.cc/',
'//registry.foobar.cc/:username=username',
'//registry.foobar.cc/:_password=$' + environmentVariable, ''
].join('\n')
process.env[environmentVariable] = encodeBase64('password')
fs.writeFile(npmRcPath, content, function (err) {
var getAuthToken = requireUncached('../index')
assert(!err, err)
var token = getAuthToken()
assert.deepStrictEqual(token, {
type: 'Basic',
username: 'username',
password: 'password',
token: 'dXNlcm5hbWU6cGFzc3dvcmQ='
})
assert.strictEqual(decodeBase64(token.token), 'username:password')
delete process.env[environmentVariable]
done()
})
})
it('should try with and without a slash at the end of registry url', function (done) {
var content = [
'registry=http://registry.foobar.eu',
'//registry.foobar.eu:_password=' + encodeBase64('barbay'),
'//registry.foobar.eu:username=barbaz', ''
].join('\n')
fs.writeFile(npmRcPath, content, function (err) {
var getAuthToken = requireUncached('../index')
assert(!err, err)
var token = getAuthToken()
assert.deepStrictEqual(token, {
token: 'YmFyYmF6OmJhcmJheQ==',
type: 'Basic',
password: 'barbay',
username: 'barbaz'
})
assert.strictEqual(decodeBase64(token.token), 'barbaz:barbay')
done()
})
})
it('should fetch for the registry given (if defined)', function (done) {
var content = [
'//registry.foobar.eu:_authToken=barbaz',
'//registry.blah.foo:_password=' + encodeBase64('barbay'),
'//registry.blah.foo:username=barbaz',
'//registry.last.thing:_authToken=yep', ''
].join('\n')
fs.writeFile(npmRcPath, content, function (err) {
var getAuthToken = requireUncached('../index')
assert(!err, err)
var token = getAuthToken('//registry.blah.foo')
assert.deepStrictEqual(token, {
token: 'YmFyYmF6OmJhcmJheQ==',
type: 'Basic',
password: 'barbay',
username: 'barbaz'
})
assert.strictEqual(decodeBase64(token.token), 'barbaz:barbay')
done()
})
})
it('recursively finds registries for deep url if option is set', function (done, undef) {
var opts = { recursive: true }
var content = [
'//registry.blah.com/foo:_password=' + encodeBase64('barbay'),
'//registry.blah.com/foo:username=barbaz',
'//registry.blah.eu:username=barbaz',
'//registry.blah.eu:_password=' + encodeBase64('foobaz'), ''
].join('\n')
fs.writeFile(npmRcPath, content, function (err) {
var getAuthToken = requireUncached('../index')
assert(!err, err)
var token = getAuthToken('https://registry.blah.com/foo/bar/baz', opts)
assert.deepStrictEqual(token, {
token: 'YmFyYmF6OmJhcmJheQ==',
type: 'Basic',
password: 'barbay',
username: 'barbaz'
})
assert.strictEqual(decodeBase64(token.token), 'barbaz:barbay')
token = getAuthToken('https://registry.blah.eu/foo/bar/baz', opts)
assert.deepStrictEqual(token, {
token: 'YmFyYmF6OmZvb2Jheg==',
type: 'Basic',
password: 'foobaz',
username: 'barbaz'
})
assert.strictEqual(decodeBase64(token.token), 'barbaz:foobaz')
assert.strictEqual(getAuthToken('//some.registry', opts), undef)
done()
})
})
})
})

View File

@@ -1,64 +0,0 @@
var fs = require('fs')
var path = require('path')
var mocha = require('mocha')
var assert = require('assert')
var requireUncached = require('require-uncached')
var npmRcPath = path.join(__dirname, '..', '.npmrc')
var afterEach = mocha.afterEach
var describe = mocha.describe
var it = mocha.it
describe('registry-url', function () {
afterEach(function (done) {
fs.unlink(npmRcPath, function () {
done()
})
})
it('should read global if no local is found', function () {
var getRegistryUrl = requireUncached('../registry-url')
getRegistryUrl()
})
it('should return default registry if no url is given for scope', function (done) {
fs.writeFile(npmRcPath, 'registry=https://registry.npmjs.org/', function (err) {
var getRegistryUrl = requireUncached('../registry-url')
assert(!err, err)
assert.strictEqual(getRegistryUrl('@somescope'), 'https://registry.npmjs.org/')
done()
})
})
it('should return registry url if url is given for scope ', function (done) {
fs.writeFile(npmRcPath, '@somescope:registry=https://some.registry/', function (err) {
var getRegistryUrl = requireUncached('../registry-url')
assert(!err, err)
assert.strictEqual(getRegistryUrl('@somescope'), 'https://some.registry/')
done()
})
})
it('should append trailing slash if not present', function (done) {
fs.writeFile(npmRcPath, '@somescope:registry=https://some.registry', function (err) {
var getRegistryUrl = requireUncached('../registry-url')
assert(!err, err)
assert.strictEqual(getRegistryUrl('@somescope'), 'https://some.registry/')
done()
})
})
it('should return configured global registry if given', function (done) {
var content = [
'registry=http://registry.foobar.eu/',
'@somescope:registry=https://some.url/', ''
].join('\n')
fs.writeFile(npmRcPath, content, function (err) {
var getRegistryUrl = requireUncached('../registry-url')
assert(!err, err)
assert.strictEqual(getRegistryUrl(), 'http://registry.foobar.eu/')
done()
})
})
})