From 5e9637da9041cc11978e8366e3d5f5a3667791f0 Mon Sep 17 00:00:00 2001 From: Juan Picado <juanpicado19@gmail.com> Date: Fri, 21 Jul 2023 00:32:14 +0200 Subject: [PATCH] fix: add missing token auth middleware (#3944) * fix: add missing token auth middleware * improve tests * format --- src/api/web/api/package.ts | 3 +- src/api/web/index.ts | 1 + src/lib/auth.ts | 2 +- test/README.md | 2 +- test/functional/store/config-1.yaml | 2 +- test/functional/store/config-2.yaml | 2 +- test/functional/store/config-3.yaml | 2 +- test/unit/modules/access/pkg.access.spec.ts | 2 +- test/unit/modules/api/config/distTag.yaml | 2 +- test/unit/modules/api/config/package.yaml | 2 +- test/unit/modules/api/config/ping.yaml | 2 +- .../modules/api/config/publish-proxy.yaml | 2 +- test/unit/modules/api/config/publish.yaml | 2 +- test/unit/modules/api/config/search.yaml | 2 +- test/unit/modules/api/config/star.yaml | 2 +- test/unit/modules/api/config/token.jwt.yaml | 2 +- test/unit/modules/api/config/token.yaml | 2 +- test/unit/modules/api/config/user.jwt.yaml | 2 +- test/unit/modules/api/config/user.yaml | 2 +- test/unit/modules/api/config/whoami.yaml | 2 +- test/unit/modules/api/legacy/api.__c.ts | 4 +-- test/unit/modules/auth/jwt.spec.ts | 2 +- test/unit/modules/bootstrap/config.yaml | 2 +- test/unit/modules/config/partials/logs.yaml | 1 + test/unit/modules/web/api.web.spec.ts | 30 ++++++++++++++----- .../config-unit-mock-server-test.yaml | 3 +- test/unit/partials/config/config_access.ts | 5 ++-- test/unit/partials/config/js/default.js | 2 +- .../partials/config/yaml/api-jwt/jwt.yaml | 3 +- .../partials/config/yaml/api.search.spec.yaml | 2 +- test/unit/partials/config/yaml/api.spec.yaml | 2 +- .../config/yaml/api.spec/web-config.yaml | 3 +- .../partials/config/yaml/api.web.spec.yaml | 9 ++++-- test/unit/partials/config/yaml/default.yaml | 3 +- .../partials/config/yaml/pkg.access.spec.yaml | 3 +- .../partials/config/yaml/profile/profile.yaml | 3 +- .../unit/partials/config/yaml/store.spec.yaml | 3 +- .../unit/partials/config/yaml/token.spec.yaml | 3 +- 38 files changed, 68 insertions(+), 55 deletions(-) diff --git a/src/api/web/api/package.ts b/src/api/web/api/package.ts index f9de1e6be..f3c9d9305 100644 --- a/src/api/web/api/package.ts +++ b/src/api/web/api/package.ts @@ -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, diff --git a/src/api/web/index.ts b/src/api/web/index.ts index c5af4d825..2c1db932f 100644 --- a/src/api/web/index.ts +++ b/src/api/web/index.ts @@ -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 diff --git a/src/lib/auth.ts b/src/lib/auth.ts index 313b02b10..f5757f9f7 100644 --- a/src/lib/auth.ts +++ b/src/lib/auth.ts @@ -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(); diff --git a/test/README.md b/test/README.md index 675f735b1..196beffd2 100644 --- a/test/README.md +++ b/test/README.md @@ -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' ); diff --git a/test/functional/store/config-1.yaml b/test/functional/store/config-1.yaml index d5fa343e3..ae18900ff 100644 --- a/test/functional/store/config-1.yaml +++ b/test/functional/store/config-1.yaml @@ -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/*': diff --git a/test/functional/store/config-2.yaml b/test/functional/store/config-2.yaml index 8e8edc4fa..83df830b8 100644 --- a/test/functional/store/config-2.yaml +++ b/test/functional/store/config-2.yaml @@ -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/*': diff --git a/test/functional/store/config-3.yaml b/test/functional/store/config-3.yaml index 2daee6f31..cbe0643d8 100644 --- a/test/functional/store/config-3.yaml +++ b/test/functional/store/config-3.yaml @@ -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': diff --git a/test/unit/modules/access/pkg.access.spec.ts b/test/unit/modules/access/pkg.access.spec.ts index f32fcf791..b5fa04fb4 100644 --- a/test/unit/modules/access/pkg.access.spec.ts +++ b/test/unit/modules/access/pkg.access.spec.ts @@ -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' ); diff --git a/test/unit/modules/api/config/distTag.yaml b/test/unit/modules/api/config/distTag.yaml index 76716921d..effb9755c 100644 --- a/test/unit/modules/api/config/distTag.yaml +++ b/test/unit/modules/api/config/distTag.yaml @@ -13,7 +13,7 @@ publish: uplinks: -logs: { type: stdout, format: pretty, level: trace } +log: { type: stdout, format: pretty, level: trace } packages: '@*/*': diff --git a/test/unit/modules/api/config/package.yaml b/test/unit/modules/api/config/package.yaml index ade72178a..0457046ba 100644 --- a/test/unit/modules/api/config/package.yaml +++ b/test/unit/modules/api/config/package.yaml @@ -13,7 +13,7 @@ publish: uplinks: -logs: { type: stdout, format: pretty, level: trace } +log: { type: stdout, format: pretty, level: trace } packages: '@*/*': diff --git a/test/unit/modules/api/config/ping.yaml b/test/unit/modules/api/config/ping.yaml index 62aa3e440..d9ab68796 100644 --- a/test/unit/modules/api/config/ping.yaml +++ b/test/unit/modules/api/config/ping.yaml @@ -7,7 +7,7 @@ web: uplinks: -logs: { type: stdout, format: pretty, level: trace } +log: { type: stdout, format: pretty, level: trace } packages: '@*/*': diff --git a/test/unit/modules/api/config/publish-proxy.yaml b/test/unit/modules/api/config/publish-proxy.yaml index 695a56860..ad86bd19a 100644 --- a/test/unit/modules/api/config/publish-proxy.yaml +++ b/test/unit/modules/api/config/publish-proxy.yaml @@ -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: '@*/*': diff --git a/test/unit/modules/api/config/publish.yaml b/test/unit/modules/api/config/publish.yaml index 07ab242e1..0e609fa75 100644 --- a/test/unit/modules/api/config/publish.yaml +++ b/test/unit/modules/api/config/publish.yaml @@ -10,7 +10,7 @@ publish: uplinks: -logs: { type: stdout, format: pretty, level: trace } +log: { type: stdout, format: pretty, level: trace } packages: '@*/*': diff --git a/test/unit/modules/api/config/search.yaml b/test/unit/modules/api/config/search.yaml index c126ee7e2..2aa18a16a 100644 --- a/test/unit/modules/api/config/search.yaml +++ b/test/unit/modules/api/config/search.yaml @@ -10,7 +10,7 @@ web: uplinks: -logs: { type: stdout, format: pretty, level: trace } +log: { type: stdout, format: pretty, level: trace } packages: 'private-*': diff --git a/test/unit/modules/api/config/star.yaml b/test/unit/modules/api/config/star.yaml index 485de50a2..df8574bd1 100644 --- a/test/unit/modules/api/config/star.yaml +++ b/test/unit/modules/api/config/star.yaml @@ -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: '@*/*': diff --git a/test/unit/modules/api/config/token.jwt.yaml b/test/unit/modules/api/config/token.jwt.yaml index 23a8c6d66..5b6a011a2 100644 --- a/test/unit/modules/api/config/token.jwt.yaml +++ b/test/unit/modules/api/config/token.jwt.yaml @@ -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: diff --git a/test/unit/modules/api/config/token.yaml b/test/unit/modules/api/config/token.yaml index 03a1a8b6e..0378bf3a3 100644 --- a/test/unit/modules/api/config/token.yaml +++ b/test/unit/modules/api/config/token.yaml @@ -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: diff --git a/test/unit/modules/api/config/user.jwt.yaml b/test/unit/modules/api/config/user.jwt.yaml index 44231ad1f..41f407442 100644 --- a/test/unit/modules/api/config/user.jwt.yaml +++ b/test/unit/modules/api/config/user.jwt.yaml @@ -34,4 +34,4 @@ middlewares: audit: enabled: true -logs: { type: stdout, format: pretty, level: info } +log: { type: stdout, format: pretty, level: info } diff --git a/test/unit/modules/api/config/user.yaml b/test/unit/modules/api/config/user.yaml index 521a4a343..318133982 100644 --- a/test/unit/modules/api/config/user.yaml +++ b/test/unit/modules/api/config/user.yaml @@ -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: '@*/*': diff --git a/test/unit/modules/api/config/whoami.yaml b/test/unit/modules/api/config/whoami.yaml index a3c639ef7..91a68fd4b 100644 --- a/test/unit/modules/api/config/whoami.yaml +++ b/test/unit/modules/api/config/whoami.yaml @@ -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: diff --git a/test/unit/modules/api/legacy/api.__c.ts b/test/unit/modules/api/legacy/api.__c.ts index 8ab39671d..7debc46c7 100644 --- a/test/unit/modules/api/legacy/api.__c.ts +++ b/test/unit/modules/api/legacy/api.__c.ts @@ -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' ); diff --git a/test/unit/modules/auth/jwt.spec.ts b/test/unit/modules/auth/jwt.spec.ts index bde2c33c5..6cfc82b38 100644 --- a/test/unit/modules/auth/jwt.spec.ts +++ b/test/unit/modules/auth/jwt.spec.ts @@ -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' ); diff --git a/test/unit/modules/bootstrap/config.yaml b/test/unit/modules/bootstrap/config.yaml index 9e290b971..a5f97e379 100644 --- a/test/unit/modules/bootstrap/config.yaml +++ b/test/unit/modules/bootstrap/config.yaml @@ -13,7 +13,7 @@ auth: name: test password: test -logs: { type: stdout, format: pretty, level: warn } +log: { type: stdout, format: pretty, level: warn } packages: '@*/*': diff --git a/test/unit/modules/config/partials/logs.yaml b/test/unit/modules/config/partials/logs.yaml index de5ff2e91..2bb90866a 100644 --- a/test/unit/modules/config/partials/logs.yaml +++ b/test/unit/modules/config/partials/logs.yaml @@ -26,6 +26,7 @@ server: middlewares: audit: enabled: true +# intended to verify backward compatibility logs: { type: stdout, format: pretty, level: http } experiments: token: false diff --git a/test/unit/modules/web/api.web.spec.ts b/test/unit/modules/web/api.web.spec.ts index 578a23451..067bed2f2 100644 --- a/test/unit/modules/web/api.web.spec.ts +++ b/test/unit/modules/web/api.web.spec.ts @@ -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) => { diff --git a/test/unit/partials/config-unit-mock-server-test.yaml b/test/unit/partials/config-unit-mock-server-test.yaml index 8e54b1fe8..1e363743e 100644 --- a/test/unit/partials/config-unit-mock-server-test.yaml +++ b/test/unit/partials/config-unit-mock-server-test.yaml @@ -11,8 +11,7 @@ auth: name: test password: test -logs: - - { type: stdout, format: pretty, level: trace } +log: { type: stdout, format: pretty, level: trace } packages: '@*/*': diff --git a/test/unit/partials/config/config_access.ts b/test/unit/partials/config/config_access.ts index 0874c8e98..91bdd638e 100644 --- a/test/unit/partials/config/config_access.ts +++ b/test/unit/partials/config/config_access.ts @@ -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; diff --git a/test/unit/partials/config/js/default.js b/test/unit/partials/config/js/default.js index 599754cf3..ebf684791 100644 --- a/test/unit/partials/config/js/default.js +++ b/test/unit/partials/config/js/default.js @@ -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' } ] ; diff --git a/test/unit/partials/config/yaml/api-jwt/jwt.yaml b/test/unit/partials/config/yaml/api-jwt/jwt.yaml index 94d292a10..b29c94b10 100644 --- a/test/unit/partials/config/yaml/api-jwt/jwt.yaml +++ b/test/unit/partials/config/yaml/api-jwt/jwt.yaml @@ -32,5 +32,4 @@ packages: middlewares: audit: enabled: true -logs: - - { type: stdout, format: pretty, level: http } +log: { type: stdout, format: pretty, level: http } diff --git a/test/unit/partials/config/yaml/api.search.spec.yaml b/test/unit/partials/config/yaml/api.search.spec.yaml index 920d5578f..2f98c7ac2 100644 --- a/test/unit/partials/config/yaml/api.search.spec.yaml +++ b/test/unit/partials/config/yaml/api.search.spec.yaml @@ -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 } diff --git a/test/unit/partials/config/yaml/api.spec.yaml b/test/unit/partials/config/yaml/api.spec.yaml index c1cf4b0e1..ae750edf0 100644 --- a/test/unit/partials/config/yaml/api.spec.yaml +++ b/test/unit/partials/config/yaml/api.spec.yaml @@ -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 } diff --git a/test/unit/partials/config/yaml/api.spec/web-config.yaml b/test/unit/partials/config/yaml/api.spec/web-config.yaml index fa63f82d5..ccbe27b6d 100644 --- a/test/unit/partials/config/yaml/api.spec/web-config.yaml +++ b/test/unit/partials/config/yaml/api.spec/web-config.yaml @@ -48,5 +48,4 @@ packages: access: $all publish: $all -logs: - - { type: stdout, format: pretty, level: warns } +log: { type: stdout, format: pretty, level: warns } diff --git a/test/unit/partials/config/yaml/api.web.spec.yaml b/test/unit/partials/config/yaml/api.web.spec.yaml index 92646fedc..6c5be1df5 100644 --- a/test/unit/partials/config/yaml/api.web.spec.yaml +++ b/test/unit/partials/config/yaml/api.web.spec.yaml @@ -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 } diff --git a/test/unit/partials/config/yaml/default.yaml b/test/unit/partials/config/yaml/default.yaml index 34d3e4bcd..ebe796b00 100644 --- a/test/unit/partials/config/yaml/default.yaml +++ b/test/unit/partials/config/yaml/default.yaml @@ -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 } diff --git a/test/unit/partials/config/yaml/pkg.access.spec.yaml b/test/unit/partials/config/yaml/pkg.access.spec.yaml index aacf91126..36c17c41f 100644 --- a/test/unit/partials/config/yaml/pkg.access.spec.yaml +++ b/test/unit/partials/config/yaml/pkg.access.spec.yaml @@ -9,5 +9,4 @@ packages: '**': access: $all proxy: remote -logs: - - { type: stdout, format: pretty, level: trace } +log: { type: stdout, format: pretty, level: trace } diff --git a/test/unit/partials/config/yaml/profile/profile.yaml b/test/unit/partials/config/yaml/profile/profile.yaml index cbfe3c653..ee7696db5 100644 --- a/test/unit/partials/config/yaml/profile/profile.yaml +++ b/test/unit/partials/config/yaml/profile/profile.yaml @@ -26,5 +26,4 @@ packages: '**': access: $authenticated publish: $authenticated -logs: - - { type: stdout, format: pretty, level: http } +log: { type: stdout, format: pretty, level: http } diff --git a/test/unit/partials/config/yaml/store.spec.yaml b/test/unit/partials/config/yaml/store.spec.yaml index 14e344562..58da1179b 100644 --- a/test/unit/partials/config/yaml/store.spec.yaml +++ b/test/unit/partials/config/yaml/store.spec.yaml @@ -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 } diff --git a/test/unit/partials/config/yaml/token.spec.yaml b/test/unit/partials/config/yaml/token.spec.yaml index 87ddb880a..6f9c6c4c0 100644 --- a/test/unit/partials/config/yaml/token.spec.yaml +++ b/test/unit/partials/config/yaml/token.spec.yaml @@ -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