Skip to content

Commit

Permalink
fix: escaped slash in namespaced packages (#2193)
Browse files Browse the repository at this point in the history
* fix: escaped slash in namespaced packages

* run format on code

* merge master branch (#2)

* chore: fix start web issue

* chore: use custom action for changeset

this is temporary while I find the way to skip create github releases for alpha

* chore: format as separated workflow (#2194)

Co-authored-by: Juan Picado <juanpicado19@gmail.com>

* merge master (#3)

* chore: fix start web issue

* chore: use custom action for changeset

this is temporary while I find the way to skip create github releases for alpha

* chore: format as separated workflow (#2194)

Co-authored-by: Juan Picado <juanpicado19@gmail.com>

* add changeset

* format

Co-authored-by: amit <amit@enso.security>
Co-authored-by: Juan Picado <juanpicado19@gmail.com>
  • Loading branch information
3 people committed Apr 24, 2021
1 parent 9ddce9d commit 648575a
Show file tree
Hide file tree
Showing 7 changed files with 41 additions and 50 deletions.
16 changes: 16 additions & 0 deletions .changeset/many-vans-care.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
'@verdaccio/tarball': patch
'@verdaccio/mock': patch
'@verdaccio/ui-theme': patch
'@verdaccio/server': patch
'@verdaccio/utils': patch
'verdaccio': patch
---

Bug Fixes

- fix escaped slash in namespaced packages

#### Related tickets

https://github.com/verdaccio/verdaccio/pull/2193
3 changes: 1 addition & 2 deletions packages/core/tarball/src/getLocalRegistryTarballUri.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import URL from 'url';
import { Request } from 'express';
import buildDebug from 'debug';

import { encodeScopedUri } from '@verdaccio/utils';
import { getPublicUrl } from '@verdaccio/url';

const debug = buildDebug('verdaccio:core:url');
Expand Down Expand Up @@ -32,5 +31,5 @@ export function getLocalRegistryTarballUri(
// header only set with proxy that setup with HTTPS
const domainRegistry = getPublicUrl(urlPrefix || '', req);

return `${domainRegistry}${encodeScopedUri(pkgName)}/-/${tarballName}`;
return `${domainRegistry}${pkgName}/-/${tarballName}`;
}
15 changes: 5 additions & 10 deletions packages/mock/src/mock-api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
HTTP_STATUS,
TOKEN_BEARER,
} from '@verdaccio/commons-api';
import { buildToken, encodeScopedUri } from '@verdaccio/utils';
import { buildToken } from '@verdaccio/utils';
import { generateRandomHexString } from '@verdaccio/utils';
import { Package } from '@verdaccio/types';
import { response } from 'express';
Expand Down Expand Up @@ -70,7 +70,7 @@ export function putPackage(
export function deletePackage(request: any, pkgName: string, token?: string): Promise<any[]> {
return new Promise((resolve) => {
const del = request
.put(`/${encodeScopedUri(pkgName)}/-rev/${generateRandomHexString(8)}`)
.put(`/${pkgName}/-rev/${generateRandomHexString(8)}`)
.set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON);

if (_.isNil(token) === false) {
Expand Down Expand Up @@ -216,18 +216,13 @@ export async function fetchPackageByVersionAndTag(
}

export async function isExistPackage(app, packageName) {
const [err] = await getPackage(request(app), '', encodeScopedUri(packageName), HTTP_STATUS.OK);
const [err] = await getPackage(request(app), '', packageName, HTTP_STATUS.OK);

return _.isNull(err);
}

export async function verifyPackageVersionDoesExist(app, packageName, version, token?: string) {
const [, res] = await getPackage(
request(app),
token as string,
encodeScopedUri(packageName),
HTTP_STATUS.OK
);
const [, res] = await getPackage(request(app), token as string, packageName, HTTP_STATUS.OK);

const { versions } = res.body;
const versionsKeys = Object.keys(versions);
Expand All @@ -236,5 +231,5 @@ export async function verifyPackageVersionDoesExist(app, packageName, version, t
}

export function generateUnPublishURI(pkgName) {
return `/${encodeScopedUri(pkgName)}/-rev/${generateRandomHexString(8)}`;
return `/${pkgName}/-rev/${generateRandomHexString(8)}`;
}
32 changes: 11 additions & 21 deletions packages/server/test/api/index.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
API_MESSAGE,
TOKEN_BEARER,
} from '@verdaccio/commons-api';
import { buildToken, encodeScopedUri } from '@verdaccio/utils';
import { buildToken } from '@verdaccio/utils';
import { setup, logger } from '@verdaccio/logger';

import { mockServer } from '@verdaccio/mock';
Expand Down Expand Up @@ -481,7 +481,7 @@ describe('endpoint unit test', () => {
const version = '2.0.0';
const pkg = generatePackageMetadata(pkgName, version);

const [err] = await putPackage(request(app), `/${encodeScopedUri(pkgName)}`, pkg, token);
const [err] = await putPackage(request(app), `/${pkgName}`, pkg, token);
if (err) {
expect(err).toBeNull();
return done(err);
Expand All @@ -490,7 +490,7 @@ describe('endpoint unit test', () => {
const newVersion = '2.0.1';
const [newErr] = await putPackage(
request(app),
`/${encodeScopedUri(pkgName)}`,
`/${pkgName}`,
generatePackageMetadata(pkgName, newVersion),
token
);
Expand Down Expand Up @@ -557,7 +557,7 @@ describe('endpoint unit test', () => {

const [newErr] = await putPackage(
request(app),
`/${encodeScopedUri(pkgName)}`,
`/${pkgName}`,
generatePackageMetadata(pkgName, newVersion),
token
);
Expand Down Expand Up @@ -606,7 +606,7 @@ describe('endpoint unit test', () => {

const [newErr, resp] = await putPackage(
request(app),
`/${encodeScopedUri(pkgName)}`,
`/${pkgName}`,
generatePackageMetadata(pkgName, newVersion),
token
);
Expand Down Expand Up @@ -801,7 +801,7 @@ describe('endpoint unit test', () => {

test('should deprecate a package', async (done) => {
const pkg = generateDeprecateMetadata(pkgName, version, 'get deprecated');
const [err] = await putPackage(request(app), `/${encodeScopedUri(pkgName)}`, pkg, token);
const [err] = await putPackage(request(app), `/${pkgName}`, pkg, token);
if (err) {
expect(err).toBeNull();
return done(err);
Expand All @@ -813,9 +813,9 @@ describe('endpoint unit test', () => {

test('should undeprecate a package', async (done) => {
let pkg = generateDeprecateMetadata(pkgName, version, 'get deprecated');
await putPackage(request(app), `/${encodeScopedUri(pkgName)}`, pkg, token);
await putPackage(request(app), `/${pkgName}`, pkg, token);
pkg = generateDeprecateMetadata(pkgName, version, '');
const [err] = await putPackage(request(app), `/${encodeScopedUri(pkgName)}`, pkg, token);
const [err] = await putPackage(request(app), `/${pkgName}`, pkg, token);
if (err) {
expect(err).toBeNull();
return done(err);
Expand All @@ -831,25 +831,15 @@ describe('endpoint unit test', () => {
let credentials = { name: 'only_publish', password: 'secretPass' };
let token = await getNewToken(request(app), credentials);
const pkg = generateDeprecateMetadata(pkgName, version, 'get deprecated');
const [err, res] = await putPackage(
request(app),
`/${encodeScopedUri(pkgName)}`,
pkg,
token
);
const [err, res] = await putPackage(request(app), `/${pkgName}`, pkg, token);
expect(err).not.toBeNull();
expect(res.body.error).toBeDefined();
expect(res.body.error).toMatch(
/user only_publish is not allowed to unpublish package @scope\/deprecate/
);
credentials = { name: 'only_unpublish', password: 'secretPass' };
token = await getNewToken(request(app), credentials);
const [err2, res2] = await putPackage(
request(app),
`/${encodeScopedUri(pkgName)}`,
pkg,
token
);
const [err2, res2] = await putPackage(request(app), `/${pkgName}`, pkg, token);
expect(err2).not.toBeNull();
expect(res2.body.error).toBeDefined();
expect(res2.body.error).toMatch(
Expand All @@ -870,7 +860,7 @@ describe('endpoint unit test', () => {
...generateVersion(pkgName, '1.0.1'),
deprecated: 'get deprecated',
};
await putPackage(request(app), `/${encodeScopedUri(pkgName)}`, pkg, token);
await putPackage(request(app), `/${pkgName}`, pkg, token);
const [, res] = await getPackage(request(app), '', pkgName);
expect(res.body.versions[version].deprecated).toEqual('get deprecated');
expect(res.body.versions['1.0.1'].deprecated).toEqual('get deprecated');
Expand Down
4 changes: 0 additions & 4 deletions packages/utils/src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -253,10 +253,6 @@ export function mask(str: string, charNum = 3): string {
return `${str.substr(0, charNum)}...${str.substr(-charNum)}`;
}

export function encodeScopedUri(packageName): string {
return packageName.replace(/\//g, '%2f');
}

export function hasDiffOneKey(versions): boolean {
return Object.keys(versions).length !== 1;
}
Expand Down
6 changes: 3 additions & 3 deletions packages/verdaccio/test/functional/package/scoped.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ export default function (server, server2) {
beforeAll(function () {
return server
.request({
uri: '/@test%2fscoped',
uri: '/@test/scoped',
headers: {
'content-type': HEADERS.JSON,
},
Expand Down Expand Up @@ -54,7 +54,7 @@ export default function (server, server2) {
expect(body.name).toBe(SCOPE);
expect(body.versions[PKG_VERSION].name).toBe(SCOPE);
expect(body.versions[PKG_VERSION].dist.tarball).toBe(
`http://${DOMAIN_SERVERS}:${port}/@test%2fscoped/-/${PKG_NAME}-${PKG_VERSION}.tgz`
`http://${DOMAIN_SERVERS}:${port}/@test/scoped/-/${PKG_NAME}-${PKG_VERSION}.tgz`
);
expect(body[DIST_TAGS]).toEqual({ latest: PKG_VERSION });
});
Expand All @@ -73,7 +73,7 @@ export default function (server, server2) {
.then(function (body) {
expect(body.name).toEqual(SCOPE);
expect(body.dist.tarball).toEqual(
`http://${DOMAIN_SERVERS}:${PORT_SERVER_2}/@test%2fscoped/-/${PKG_NAME}-` +
`http://${DOMAIN_SERVERS}:${PORT_SERVER_2}/@test/scoped/-/${PKG_NAME}-` +
`${PKG_VERSION}.tgz`
);
});
Expand Down
15 changes: 5 additions & 10 deletions packages/verdaccio/test/unit/__helper/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import _ from 'lodash';
import request from 'supertest';

import { HEADER_TYPE, HEADERS, HTTP_STATUS, TOKEN_BEARER } from '@verdaccio/commons-api';
import { buildToken, encodeScopedUri } from '@verdaccio/utils';
import { buildToken } from '@verdaccio/utils';
import { generateRandomHexString } from '@verdaccio/utils';
import { Package } from '@verdaccio/types';

Expand Down Expand Up @@ -46,7 +46,7 @@ export function putPackage(
export function deletePackage(request: any, pkgName: string, token?: string): Promise<any[]> {
return new Promise((resolve) => {
let del = request
.put(`/${encodeScopedUri(pkgName)}/-rev/${generateRandomHexString(8)}`)
.put(`/${pkgName}/-rev/${generateRandomHexString(8)}`)
.set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON);

if (_.isNil(token) === false) {
Expand Down Expand Up @@ -193,18 +193,13 @@ export async function fetchPackageByVersionAndTag(
}

export async function isExistPackage(app, packageName) {
const [err] = await getPackage(request(app), '', encodeScopedUri(packageName), HTTP_STATUS.OK);
const [err] = await getPackage(request(app), '', packageName, HTTP_STATUS.OK);

return _.isNull(err);
}

export async function verifyPackageVersionDoesExist(app, packageName, version, token?: string) {
const [, res] = await getPackage(
request(app),
token as string,
encodeScopedUri(packageName),
HTTP_STATUS.OK
);
const [, res] = await getPackage(request(app), token as string, packageName, HTTP_STATUS.OK);

const { versions } = res.body;
const versionsKeys = Object.keys(versions);
Expand All @@ -213,5 +208,5 @@ export async function verifyPackageVersionDoesExist(app, packageName, version, t
}

export function generateUnPublishURI(pkgName) {
return `/${encodeScopedUri(pkgName)}/-rev/${generateRandomHexString(8)}`;
return `/${pkgName}/-rev/${generateRandomHexString(8)}`;
}

0 comments on commit 648575a

Please sign in to comment.