0
Fork 0
mirror of https://github.com/verdaccio/verdaccio.git synced 2025-03-18 02:22:46 -05:00

fix: add missing token auth middleware (#3944)

* fix: add missing token auth middleware

* improve tests

* format
This commit is contained in:
Juan Picado 2023-07-21 00:32:14 +02:00 committed by GitHub
parent 93bc69abc1
commit 5e9637da90
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
38 changed files with 68 additions and 55 deletions

View file

@ -69,7 +69,8 @@ function addPackageWebApi(pkgRouter: Router, storage: Storage, auth: Auth, confi
const pkgCopy = { ...pkg };
pkgCopy.author = formatAuthor(pkg.author);
try {
if (await checkAllow(pkg.name, req.remote_user)) {
const isAllowed = await checkAllow(pkg.name, req.remote_user);
if (isAllowed) {
if (config.web) {
pkgCopy.author.avatar = generateGravatarUrl(
pkgCopy.author.email,

View file

@ -30,6 +30,7 @@ export default (config, auth, storage) => {
const pluginOptions = loadTheme(config) || require('@verdaccio/ui-theme')();
// eslint-disable-next-line new-cap
const router = Router();
router.use(auth.webUIJWTmiddleware());
router.use(setSecurityWebHeaders);
// render web
// @ts-ignore

View file

@ -299,7 +299,7 @@ class Auth {
{ name: packageName, version: packageVersion },
getMatchedPackagesSpec(packageName, this.config.packages)
);
debug('allow publish for %o init | plugins: %o', packageName, plugins);
debug('allow publish for %o init | plugins: %o', packageName, plugins?.length);
(function next(): void {
const plugin = plugins.shift();

View file

@ -76,7 +76,7 @@ const configForTest = configDefault(
url: `http://${DOMAIN_SERVERS}:${mockServerPort}`,
},
},
logs: [{ type: 'stdout', format: 'pretty', level: 'trace' }],
log: { type: 'stdout', format: 'pretty', level: 'trace' },
},
'api.spec.yaml'
);

View file

@ -29,7 +29,7 @@ uplinks:
baduplink:
url: http://localhost:55666/
logs: { type: stdout, format: pretty, level: trace }
log: { type: stdout, format: pretty, level: trace }
packages:
'@test/*':

View file

@ -30,7 +30,7 @@ auth:
name: authtest
password: blahblah-password
logs: { type: stdout, format: pretty, level: trace }
log: { type: stdout, format: pretty, level: trace }
packages:
'@test/*':

View file

@ -18,7 +18,7 @@ auth:
name: test
password: test
logs: { type: stdout, format: pretty, level: trace }
log: { type: stdout, format: pretty, level: trace }
packages:
'pkg-gh131':

View file

@ -36,7 +36,7 @@ describe('api with no limited access configuration', () => {
url: `http://${DOMAIN_SERVERS}:${mockServerPort}`,
},
},
logs: [{ type: 'stdout', format: 'pretty', level: 'warn' }],
log: { type: 'stdout', format: 'pretty', level: 'warn' },
},
'pkg.access.spec.yaml'
);

View file

@ -13,7 +13,7 @@ publish:
uplinks:
logs: { type: stdout, format: pretty, level: trace }
log: { type: stdout, format: pretty, level: trace }
packages:
'@*/*':

View file

@ -13,7 +13,7 @@ publish:
uplinks:
logs: { type: stdout, format: pretty, level: trace }
log: { type: stdout, format: pretty, level: trace }
packages:
'@*/*':

View file

@ -7,7 +7,7 @@ web:
uplinks:
logs: { type: stdout, format: pretty, level: trace }
log: { type: stdout, format: pretty, level: trace }
packages:
'@*/*':

View file

@ -9,7 +9,7 @@ uplinks:
npmjs:
url: https://registry.npmjs.org/
logs: { type: stdout, format: pretty, level: trace }
log: { type: stdout, format: pretty, level: trace }
packages:
'@*/*':

View file

@ -10,7 +10,7 @@ publish:
uplinks:
logs: { type: stdout, format: pretty, level: trace }
log: { type: stdout, format: pretty, level: trace }
packages:
'@*/*':

View file

@ -10,7 +10,7 @@ web:
uplinks:
logs: { type: stdout, format: pretty, level: trace }
log: { type: stdout, format: pretty, level: trace }
packages:
'private-*':

View file

@ -9,7 +9,7 @@ uplinks:
npmjs:
url: https://registry.npmjs.org/
logs: { type: stdout, format: pretty, level: info }
log: { type: stdout, format: pretty, level: info }
packages:
'@*/*':

View file

@ -20,7 +20,7 @@ packages:
access: $authenticated
publish: $authenticated
logs: { type: stdout, format: pretty, level: debug }
log: { type: stdout, format: pretty, level: debug }
## enable token for testing
flags:

View file

@ -12,7 +12,7 @@ packages:
access: $authenticated
publish: $authenticated
logs: { type: stdout, format: pretty, level: debug }
log: { type: stdout, format: pretty, level: debug }
## enable token for testing
flags:

View file

@ -34,4 +34,4 @@ middlewares:
audit:
enabled: true
logs: { type: stdout, format: pretty, level: info }
log: { type: stdout, format: pretty, level: info }

View file

@ -9,7 +9,7 @@ uplinks:
ver:
url: https://registry.verdaccio.org
logs: { type: stdout, format: pretty, level: trace }
log: { type: stdout, format: pretty, level: trace }
packages:
'@*/*':

View file

@ -6,7 +6,7 @@ uplinks:
npmjs:
url: https://registry.npmjs.org/
logs: { type: stdout, format: pretty, level: trace }
log: { type: stdout, format: pretty, level: trace }
auth:
htpasswd:

View file

@ -92,7 +92,7 @@ describe('endpoint unit test', () => {
fail_timeout: '1s',
},
},
logs: [{ type: 'stdout', format: 'pretty', level: 'warn' }],
log: { type: 'stdout', format: 'pretty', level: 'warn' },
},
'api.spec.yaml'
);
@ -1042,7 +1042,7 @@ describe('endpoint unit test', () => {
url: `http://${DOMAIN_SERVERS}:${mockServerPort}`,
},
},
logs: [{ type: 'stdout', format: 'pretty', level: 'warn' }],
log: { type: 'stdout', format: 'pretty', level: 'warn' },
},
'api.spec.yaml'
);

View file

@ -49,7 +49,7 @@ describe('endpoint user auth JWT unit test', () => {
file: './test-jwt-storage/.htpasswd_jwt_auth',
},
},
logs: [{ type: 'stdout', format: 'pretty', level: 'warn' }],
log: { type: 'stdout', format: 'pretty', level: 'warn' },
},
'api-jwt/jwt.yaml'
);

View file

@ -13,7 +13,7 @@ auth:
name: test
password: test
logs: { type: stdout, format: pretty, level: warn }
log: { type: stdout, format: pretty, level: warn }
packages:
'@*/*':

View file

@ -26,6 +26,7 @@ server:
middlewares:
audit:
enabled: true
# intended to verify backward compatibility
logs: { type: stdout, format: pretty, level: http }
experiments:
token: false

View file

@ -2,6 +2,8 @@ import path from 'path';
import rimraf from 'rimraf';
import request from 'supertest';
import { buildToken } from '@verdaccio/utils';
import endPointAPI from '../../../../src/api';
import {
API_ERROR,
@ -9,13 +11,16 @@ import {
HEADERS,
HEADER_TYPE,
HTTP_STATUS,
TOKEN_BEARER,
} from '../../../../src/lib/constants';
import { DOMAIN_SERVERS } from '../../../functional/config.functional';
import { generatePackageMetadata } from '../../../helpers/generatePackageMetadata';
import { addUser } from '../../__helper/api';
import { mockServer } from '../../__helper/mock';
import configDefault from '../../partials/config';
import forbiddenPlace from '../../partials/forbidden-place';
import publishMetadata from '../../partials/publish-api';
import { getNewToken } from '../api/_helper';
require('../../../../src/lib/logger').setup([]);
@ -70,17 +75,28 @@ describe('endpoint web unit test', () => {
.set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON)
.send(JSON.stringify(forbiddenPlace))
.expect(HTTP_STATUS.CREATED);
await request(app)
.put('/@protected/pk1')
.set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON)
.send(JSON.stringify(generatePackageMetadata('@protected/pk1')))
.expect(HTTP_STATUS.CREATED);
});
describe('Packages', () => {
test('should display all packages', (done) => {
request(app)
test('should display packages without login', async () => {
// this packages is protected at the yaml file
const res = await request(app).get('/-/verdaccio/data/packages').expect(HTTP_STATUS.OK);
expect(res.body).toHaveLength(1);
});
test('should display all packages logged', async () => {
const token = await getNewToken(app, { name: 'jota_token', password: 'secretPass' });
// this packages is protected at the yaml file
const res = await request(app)
.get('/-/verdaccio/data/packages')
.expect(HTTP_STATUS.OK)
.end(function (err, res) {
expect(res.body).toHaveLength(1);
done();
});
.set(HEADERS.AUTHORIZATION, buildToken(TOKEN_BEARER, token))
.expect(HTTP_STATUS.OK);
expect(res.body).toHaveLength(2);
});
test.skip('should display scoped readme', (done) => {

View file

@ -11,8 +11,7 @@ auth:
name: test
password: test
logs:
- { type: stdout, format: pretty, level: trace }
log: { type: stdout, format: pretty, level: trace }
packages:
'@*/*':

View file

@ -18,9 +18,8 @@ const config = {
proxy: 'npmjs'
}
},
logs: [
{type: 'stdout', format: 'pretty', level: 'fatal'},
],
log: {type: 'stdout', format: 'pretty', level: 'fatal'}
,
};
export default config;

View file

@ -12,4 +12,4 @@ module.exports = { storage: './storage_default_storage',
publish: '$authenticated',
proxy: 'npmjs' },
'*': { access: '$all', publish: '$all', proxy: 'npmjs' } },
logs: [ { type: 'stdout', format: 'pretty', level: 'warn' } ] };
log: { type: 'stdout', format: 'pretty', level: 'warn' } ] ;

View file

@ -32,5 +32,4 @@ packages:
middlewares:
audit:
enabled: true
logs:
- { type: stdout, format: pretty, level: http }
log: { type: stdout, format: pretty, level: http }

View file

@ -28,4 +28,4 @@ packages:
publish: $all
unpublish: xxx
proxy: npmjs
logs: { type: stdout, format: pretty, level: trace }
log: { type: stdout, format: pretty, level: trace }

View file

@ -95,4 +95,4 @@ packages:
publish: $all
unpublish: xxx
proxy: npmjs
logs: { type: stdout, format: pretty, level: trace }
log: { type: stdout, format: pretty, level: trace }

View file

@ -48,5 +48,4 @@ packages:
access: $all
publish: $all
logs:
- { type: stdout, format: pretty, level: warns }
log: { type: stdout, format: pretty, level: warns }

View file

@ -8,11 +8,15 @@ uplinks:
npmjs:
url: http://localhost:4873/
packages:
'@protected/*':
access: jota_token
publish: $all
proxy: npmjs
'@*/*':
access: $all
publish: $all
proxy: npmjs
unpublish: npmjs
unpublish: somethingelse
'forbidden-place':
access: nobody
publish: $all
@ -21,5 +25,4 @@ packages:
publish: $all
unpublish: xxx
proxy: npmjs
logs:
- { type: stdout, format: pretty, level: trace }
log: { type: stdout, format: pretty, level: trace }

View file

@ -38,5 +38,4 @@ packages:
access: $all
publish: $all
proxy: npmjs
logs:
- { type: stdout, format: pretty, level: warn }
log: { type: stdout, format: pretty, level: warn }

View file

@ -9,5 +9,4 @@ packages:
'**':
access: $all
proxy: remote
logs:
- { type: stdout, format: pretty, level: trace }
log: { type: stdout, format: pretty, level: trace }

View file

@ -26,5 +26,4 @@ packages:
'**':
access: $authenticated
publish: $authenticated
logs:
- { type: stdout, format: pretty, level: http }
log: { type: stdout, format: pretty, level: http }

View file

@ -17,5 +17,4 @@ packages:
'npm_test':
access: $all
publish: $all
logs:
- { type: stdout, format: pretty, level: warn }
log: { type: stdout, format: pretty, level: warn }

View file

@ -16,8 +16,7 @@ packages:
'only-you-can-publish':
access: $authenticated
publish: $authenticated
logs:
- { type: stdout, format: pretty, level: trace }
log: { type: stdout, format: pretty, level: trace }
experiments:
## enable token for testing
token: true