Skip to content

Commit

Permalink
Fix #88: Resolve unreachable statement in DockerAssemblyManager#ensur…
Browse files Browse the repository at this point in the history
…eThatArtifactFileIsSet
  • Loading branch information
rohanKanojia authored and manusa committed Mar 27, 2020
1 parent f553aa6 commit c1b3758
Show file tree
Hide file tree
Showing 5 changed files with 196 additions and 25 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ Usage:
* Fix #112: Fix windows specific path error while splitting file path
* Fix #102: HelmMojo works again
* Fix #120: Critical bugs reported by Sonar
* Fix #88: Unreachable statement in DockerAssemblyManager
* Fix #122: Bug 561261 - jkube-kit - insecure yaml load leading to RCE (CWE-502)

### 0.2.0 (05-03-2020)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,18 +133,15 @@ public File createDockerTarArchive(
verifyGivenDockerfile(dockerFile, buildConfig, params.getProperties(), log);
interpolateDockerfile(dockerFile, buildDirs, params.getProperties());
// User dedicated Dockerfile from extra directory
archiveCustomizers.add(new ArchiverCustomizer() {
@Override
public JKubeBuildTarArchiver customize(JKubeBuildTarArchiver archiver) {
// If the content is added as archive, then we need to add the Dockerfile from the builddir
// directly to docker.tar (as the output builddir is not picked up in archive mode)
if (isArchive(assemblyConfig)) {
String name = dockerFile.getName();
archiver.includeFile(new File(buildDirs.getOutputDirectory(), name), name);
}

return archiver;
archiveCustomizers.add(archiver -> {
// If the content is added as archive, then we need to add the Dockerfile from the builddir
// directly to docker.tar (as the output builddir is not picked up in archive mode)
if (isArchive(assemblyConfig)) {
String name = dockerFile.getName();
archiver.includeFile(new File(buildDirs.getOutputDirectory(), name), name);
}

return archiver;
});
} else {
// Create custom docker file in output dir
Expand Down Expand Up @@ -384,31 +381,27 @@ private void createAssemblyArchive(JKubeAssemblyConfiguration assemblyConfig, JK
// object which is then not available for the BuildMojo (there the file is still null leading to the
// the "Cannot include project artifact: ... The following patterns were never triggered in this artifact inclusion filter: <artifact>"
// warning with an error following.
private File ensureThatArtifactFileIsSet(JKubeProject project) throws IOException {
File artifact = project.getArtifact();
if (artifact == null) {
return null;
}
File oldFile = artifact;
protected File ensureThatArtifactFileIsSet(JKubeProject project) throws IOException {
File oldFile = project.getArtifact();
if (oldFile != null) {
return oldFile;
}

String finalName = project.getBuildFinalName();
String target = project.getBuildDirectory();
if (finalName == null || target == null) {
return null;
}
File artifactFile = new File(target, finalName + "." + project.getPackaging());
if (artifactFile.exists() && artifactFile.isFile()) {
setArtifactFile(project, artifactFile);
if (finalName != null && target != null) {
File artifactFile = new File(target, finalName + "." + project.getPackaging());
if (artifactFile.exists() && artifactFile.isFile()) {
setArtifactFile(project, artifactFile);
return artifactFile;
}
}
return null;
}

private void setArtifactFile(JKubeProject project, File artifactFile) throws IOException {
File artifact = project.getArtifact();
if (artifact != null && artifactFile != null) {
if (artifactFile != null) {
File artifact = new File(project.getBuildDirectory() + artifactFile.getName());
Files.copy(Paths.get(artifactFile.getAbsolutePath()), Paths.get(artifact.getAbsolutePath()), StandardCopyOption.REPLACE_EXISTING);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,10 @@
package org.eclipse.jkube.kit.build.core.assembly;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.Properties;

import org.eclipse.jkube.kit.build.core.JKubeBuildContext;
Expand All @@ -30,10 +33,15 @@
import mockit.Mocked;
import mockit.Tested;
import mockit.Verifications;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;

public class DockerAssemblyManagerTest {

Expand All @@ -43,6 +51,9 @@ public class DockerAssemblyManagerTest {
@Tested
private DockerAssemblyManager assemblyManager;

@Rule
public TemporaryFolder temporaryFolder = new TemporaryFolder();

@Test
public void testNoAssembly() {
JKubeBuildConfiguration buildConfig = new JKubeBuildConfiguration.Builder().build();
Expand Down Expand Up @@ -131,5 +142,162 @@ private JKubeBuildConfiguration createBuildConfig() {
.build();
}

@Test
public void testEnsureThatArtifactFileIsSetWithProjectArtifactSet() throws IOException {
// Given
JKubeProject project = new JKubeProject.Builder()
.artifact(temporaryFolder.newFile("temp-project-0.0.1.jar"))
.build();

// When
File artifactFile = assemblyManager.ensureThatArtifactFileIsSet(project);

// Then
assertNotNull(artifactFile);
assertEquals("temp-project-0.0.1.jar", artifactFile.getName());
}

@Test
public void testEnsureThatArtifactFileIsSetWithNullProjectArtifact() throws IOException {
// Given
File targetDirectory = temporaryFolder.newFolder("target");
File jarFile = new File(targetDirectory, "foo-project-0.0.1.jar");
jarFile.createNewFile();
JKubeProject project = new JKubeProject.Builder()
.buildDirectory(targetDirectory.getAbsolutePath())
.packaging("jar")
.buildFinalName("foo-project-0.0.1")
.build();

// When
File artifactFile = assemblyManager.ensureThatArtifactFileIsSet(project);

// Then
assertNotNull(artifactFile);
assertTrue(artifactFile.exists());
assertEquals("foo-project-0.0.1.jar", artifactFile.getName());
}

@Test
public void testEnsureThatArtifactFileIsSetWithEverythingNull() throws IOException {
// Given
JKubeProject project = new JKubeProject.Builder().build();

// When
File artifactFile = assemblyManager.ensureThatArtifactFileIsSet(project);

// Then
assertNull(artifactFile);
}

@Test
public void testCreateDockerTarArchiveWithoutDockerfile() throws IOException {
// Given
File targetFolder = temporaryFolder.newFolder("target");
File finalArtifactFile = new File(targetFolder, "test-0.1.0.jar");
finalArtifactFile.createNewFile();
File outputDirectory = new File(targetFolder, "docker");

final JKubeBuildContext jKubeBuildContext = new JKubeBuildContext.Builder()
.project(new JKubeProject.Builder()
.groupId("org.eclipse.jkube")
.artifactId("test")
.packaging("jar")
.version("0.1.0")
.buildDirectory(targetFolder.getAbsolutePath())
.artifact(finalArtifactFile)
.build())
.outputDirectory(outputDirectory.getAbsolutePath())
.sourceDirectory(temporaryFolder.getRoot().getAbsolutePath() + "/src/main/docker")
.build();
final JKubeBuildConfiguration jKubeBuildConfiguration = new JKubeBuildConfiguration.Builder()
.build();

// When
File dockerArchiveFile = assemblyManager.createDockerTarArchive("test-image", jKubeBuildContext, jKubeBuildConfiguration, prefixedLogger, null);

// Then
assertNotNull(dockerArchiveFile);
assertTrue(dockerArchiveFile.exists());
assertEquals(2560, dockerArchiveFile.length());
assertTrue(outputDirectory.isDirectory() && outputDirectory.exists());
File buildOutputDir = new File(outputDirectory, "test-image");
assertTrue(buildOutputDir.isDirectory() && buildOutputDir.exists());
File buildDir = new File(buildOutputDir, "build");
File workDir = new File(buildOutputDir, "work");
File tmpDir = new File(buildOutputDir, "tmp");
assertTrue(buildDir.isDirectory() && buildDir.exists());
assertTrue(workDir.isDirectory() && workDir.exists());
assertTrue(tmpDir.isDirectory() && tmpDir.exists());
assertTrue(new File(buildDir, "Dockerfile").exists());
File assemblyNameDirInBuild = new File(buildDir, "maven");
assertTrue(assemblyNameDirInBuild.isDirectory() && assemblyNameDirInBuild.exists());
assertTrue(new File(assemblyNameDirInBuild, "test-0.1.0.jar").exists());

}

@Test
public void testCreateDockerTarArchiveWithDockerfile() throws IOException {
// Given
File baseProjectDir = temporaryFolder.newFolder("test-workspace");
File dockerFile = new File(baseProjectDir, "Dockerfile");
dockerFile.createNewFile();
writeASimpleDockerfile(dockerFile);
File targetFolder = new File(baseProjectDir, "target");
targetFolder.mkdirs();
File finalArtifactFile = new File(targetFolder, "test-0.1.0.jar");
finalArtifactFile.createNewFile();
File outputDirectory = new File(targetFolder, "docker");


final JKubeBuildContext jKubeBuildContext = new JKubeBuildContext.Builder()
.project(new JKubeProject.Builder()
.groupId("org.eclipse.jkube")
.artifactId("test")
.packaging("jar")
.version("0.1.0")
.buildDirectory("target")
.baseDirectory(baseProjectDir)
.outputDirectory("target/classes")
.properties(new Properties())
.artifact(finalArtifactFile)
.build())
.outputDirectory("target/docker")
.sourceDirectory(baseProjectDir.getPath() + "/src/main/docker")
.build();
final JKubeBuildConfiguration jKubeBuildConfiguration = new JKubeBuildConfiguration.Builder()
.dockerFileDir(baseProjectDir.getPath())
.dockerFile(dockerFile.getPath())
.dockerFileFile(dockerFile)
.build();


// When
File dockerArchiveFile = assemblyManager.createDockerTarArchive("test-image", jKubeBuildContext, jKubeBuildConfiguration, prefixedLogger, null);

// Then
assertNotNull(dockerArchiveFile);
assertTrue(dockerArchiveFile.exists());
assertEquals(2048, dockerArchiveFile.length());
assertTrue(outputDirectory.isDirectory() && outputDirectory.exists());
File buildOutputDir = new File(outputDirectory, "test-image");
assertTrue(buildOutputDir.isDirectory() && buildOutputDir.exists());
File buildDir = new File(buildOutputDir, "build");
File workDir = new File(buildOutputDir, "work");
File tmpDir = new File(buildOutputDir, "tmp");
assertTrue(buildDir.isDirectory() && buildDir.exists());
assertTrue(workDir.isDirectory() && workDir.exists());
assertTrue(tmpDir.isDirectory() && tmpDir.exists());
assertTrue(new File(buildDir, "Dockerfile").exists());
File assemblyNameDirInBuild = new File(buildDir, "maven");
assertTrue(assemblyNameDirInBuild.isDirectory() && assemblyNameDirInBuild.exists());
}

private void writeASimpleDockerfile(File dockerFile) throws FileNotFoundException, UnsupportedEncodingException {
PrintWriter writer = new PrintWriter(dockerFile, "UTF-8");
writer.println("FROM openjdk:jre");
writer.close();
}

}

Original file line number Diff line number Diff line change
Expand Up @@ -425,6 +425,10 @@ public static JKubeProject convertMavenProjectToJKubeProject(MavenProject mavenP
builder.scmUrl(mavenProject.getScm().getUrl());
}

if (mavenProject.getArtifact() != null) {
builder.artifact(mavenProject.getArtifact().getFile());
}

return builder.build();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -340,6 +340,11 @@ public TypedBuilder<A, B> dockerFileDir(String dir) {
return this;
}

public TypedBuilder<A, B> dockerFileFile(File dockerFile) {
config.dockerFileFile = dockerFile;
return this;
}

public TypedBuilder<A, B> filter(String filter) {
config.filter = filter;
return this;
Expand Down

0 comments on commit c1b3758

Please sign in to comment.