From 54353665270033d92d65931de18142d722b28eac Mon Sep 17 00:00:00 2001 From: Wenjie Guo Date: Thu, 16 Jun 2022 11:36:33 +0800 Subject: [PATCH] Fix the NPM listing --- .../browse/ContentBrowseController.java | 14 +++++++ .../ftest/StoreNPMThenListingDirTest.java | 37 ++++++++++++++++++- 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/addons/content-browse/common/src/main/java/org/commonjava/indy/content/browse/ContentBrowseController.java b/addons/content-browse/common/src/main/java/org/commonjava/indy/content/browse/ContentBrowseController.java index e4f44a6082..d5c7832b6d 100644 --- a/addons/content-browse/common/src/main/java/org/commonjava/indy/content/browse/ContentBrowseController.java +++ b/addons/content-browse/common/src/main/java/org/commonjava/indy/content/browse/ContentBrowseController.java @@ -15,12 +15,14 @@ */ package org.commonjava.indy.content.browse; +import org.commonjava.cdi.util.weft.ThreadContext; import org.commonjava.indy.IndyWorkflowException; import org.commonjava.indy.content.ContentManager; import org.commonjava.indy.content.StoreResource; import org.commonjava.indy.content.browse.model.ContentBrowseResult; import org.commonjava.indy.data.IndyDataException; import org.commonjava.indy.data.StoreDataManager; +import org.commonjava.indy.util.RequestContextHelper; import org.commonjava.o11yphant.metrics.annotation.Measure; import org.commonjava.indy.model.core.ArtifactStore; import org.commonjava.indy.model.core.StoreKey; @@ -43,6 +45,7 @@ import java.util.Set; import java.util.TreeMap; +import static org.commonjava.indy.pkg.npm.model.NPMPackageTypeDescriptor.NPM_METADATA_NAME; import static org.commonjava.maven.galley.util.PathUtils.normalize; import static org.commonjava.maven.galley.util.PathUtils.parentPath; @@ -89,7 +92,13 @@ private ContentBrowseResult renderResult( final StoreKey key, final String reque String path = requestPath.endsWith( "/" ) ? requestPath : requestPath + "/"; final ArtifactStore store = getStore( key ); + + // This is used to let galley ignore the NPMPathStorageCalculator handling, + // which will append package.json to a directory transfer and make listing not applicable. + ThreadContext context = ThreadContext.getContext( true ); + context.put( RequestContextHelper.IS_RAW_VIEW, Boolean.TRUE ); final List listed = contentManager.list( store, path, eventMetadata ); + context.put( RequestContextHelper.IS_RAW_VIEW, Boolean.FALSE ); final Map> listingUrls = new TreeMap<>(); @@ -115,6 +124,11 @@ private ContentBrowseResult renderResult( final StoreKey key, final String reque if ( p.endsWith( "-" ) || p.endsWith( "-/" ) ) { //skip npm adduser path to avoid the sensitive info showing. + //continue; + } + if ( p.endsWith( NPM_METADATA_NAME ) ) + { + //the package.json should not be visible for user continue; } else if ( pass == 1 ) diff --git a/addons/content-browse/ftests/src/main/java/org/commonjava/indy/content/browse/ftest/StoreNPMThenListingDirTest.java b/addons/content-browse/ftests/src/main/java/org/commonjava/indy/content/browse/ftest/StoreNPMThenListingDirTest.java index d6392a2abe..8123bbb24c 100644 --- a/addons/content-browse/ftests/src/main/java/org/commonjava/indy/content/browse/ftest/StoreNPMThenListingDirTest.java +++ b/addons/content-browse/ftests/src/main/java/org/commonjava/indy/content/browse/ftest/StoreNPMThenListingDirTest.java @@ -16,9 +16,13 @@ package org.commonjava.indy.content.browse.ftest; import org.apache.commons.io.IOUtils; +import org.commonjava.indy.client.core.IndyClientModule; +import org.commonjava.indy.content.browse.client.IndyContentBrowseClientModule; +import org.commonjava.indy.content.browse.model.ContentBrowseResult; import org.commonjava.indy.ftest.core.AbstractContentManagementTest; import org.commonjava.indy.model.core.HostedRepository; import org.commonjava.indy.model.core.StoreKey; +import org.commonjava.indy.model.core.io.IndyObjectMapper; import org.commonjava.indy.pkg.maven.model.MavenPackageTypeDescriptor; import org.commonjava.indy.pkg.npm.model.NPMPackageTypeDescriptor; import org.junit.Test; @@ -26,6 +30,8 @@ import java.io.ByteArrayInputStream; import java.io.InputStream; import java.net.URL; +import java.util.Collection; +import java.util.Collections; import static org.commonjava.indy.model.core.StoreType.hosted; import static org.hamcrest.CoreMatchers.equalTo; @@ -78,12 +84,20 @@ public void run() final String dirPath = "/@babel/opossum"; final String path = dirPath + "/package.json"; + final String tarPath = dirPath + "/-/opossum-5.0.0.tgz"; final StoreKey testKey = hostedRepository.getKey(); + assertThat( client.content().exists( testKey, tarPath ), equalTo( false ) ); + + client.content().store( testKey, tarPath, stream ); + + assertThat( client.content().exists( testKey, tarPath ), equalTo( true ) ); + + final InputStream stream2 = new ByteArrayInputStream( content.getBytes() ); assertThat( client.content().exists( testKey, path ), equalTo( false ) ); - client.content().store( testKey, path, stream ); + client.content().store( testKey, path, stream2 ); assertThat( client.content().exists( testKey, path ), equalTo( true ) ); @@ -103,8 +117,29 @@ public void run() assertThat( json.contains( "/@babel/" ), equalTo( true ) ); } + IndyContentBrowseClientModule browseClientModule = client.module( IndyContentBrowseClientModule.class ); + + ContentBrowseResult browseResult = browseClientModule.getContentList(testKey, "/@babel/opossum"); + String browseResultInJson = new IndyObjectMapper(false).writeValueAsString(browseResult); + + assertThat( browseResultInJson.contains("/@babel/opossum/-/"), equalTo(true) ); + assertThat( "no metadata result", browseResult, notNullValue() ); + + try(InputStream jsonIn = client.content().get( testKey, "/@babel/opossum" )) + { + assertThat( jsonIn, notNullValue() ); + String json = IOUtils.toString( jsonIn ); + assertEquals(content, json); + } + assertThat( client.content() .exists( testKey, path ), equalTo( true ) ); } + + @Override + protected Collection getAdditionalClientModules() + { + return Collections.singletonList( new IndyContentBrowseClientModule() ); + } }