Skip to content

Commit 481a9c2

Browse files
committed
detect permissions for addFile
1 parent 043c50e commit 481a9c2

File tree

2 files changed

+62
-4
lines changed

2 files changed

+62
-4
lines changed

src/main/java/org/codehaus/plexus/archiver/AbstractArchiver.java

+18-2
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040

4141
import org.codehaus.plexus.archiver.manager.ArchiverManager;
4242
import org.codehaus.plexus.archiver.manager.NoSuchArchiverException;
43+
import org.codehaus.plexus.components.io.attributes.PlexusIoResourceAttributeUtils;
4344
import org.codehaus.plexus.components.io.attributes.PlexusIoResourceAttributes;
4445
import org.codehaus.plexus.components.io.attributes.SimpleResourceAttributes;
4546
import org.codehaus.plexus.components.io.functions.ResourceAttributeSupplier;
@@ -364,9 +365,20 @@ public void addFileSet(@Nonnull final FileSet fileSet) throws ArchiverException
364365

365366
@Override
366367
public void addFile(@Nonnull final File inputFile, @Nonnull final String destFileName) throws ArchiverException {
367-
final int fileMode = getOverrideFileMode();
368+
int permissions;
369+
if (forcedFileMode > 0) {
370+
permissions = forcedFileMode;
371+
} else {
372+
permissions = PlexusIoResourceAttributes.UNKNOWN_OCTAL_MODE;
373+
try {
374+
permissions = PlexusIoResourceAttributeUtils.getFileAttributes(inputFile)
375+
.getOctalMode();
376+
} catch (IOException ioe) {
377+
// ignore
378+
}
379+
}
368380

369-
addFile(inputFile, destFileName, fileMode);
381+
addFile(inputFile, destFileName, permissions);
370382
}
371383

372384
@Override
@@ -462,6 +474,10 @@ public void addFile(@Nonnull final File inputFile, @Nonnull String destFileName,
462474
permissions = getOverrideFileMode();
463475
}
464476

477+
if (umask > 0 && permissions != PlexusIoResourceAttributes.UNKNOWN_OCTAL_MODE) {
478+
permissions &= ~umask;
479+
}
480+
465481
try {
466482
// do a null check here, to avoid creating a file stream if there are no filters...
467483
ArchiveEntry entry = ArchiveEntry.createFileEntry(destFileName, inputFile, permissions, getDirectoryMode());

src/test/java/org/codehaus/plexus/archiver/jar/JarArchiverTest.java

+44-2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import java.util.zip.ZipEntry;
1515
import java.util.zip.ZipFile;
1616

17+
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
1718
import org.codehaus.plexus.archiver.ArchiverException;
1819
import org.junit.jupiter.api.Test;
1920
import org.junit.jupiter.api.io.TempDir;
@@ -123,14 +124,16 @@ private void createReproducibleBuild(String timeZoneId) throws IOException, Mani
123124

124125
JarArchiver archiver = getJarArchiver();
125126
archiver.setDestFile(jarFile.toFile());
126-
archiver.addConfiguredManifest(manifest);
127-
archiver.addDirectory(new File("src/test/resources/java-classes"));
128127

129128
SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
130129
long parsedTime = isoFormat.parse("2038-01-19T03:14:08Z").getTime();
131130
FileTime lastModTime = FileTime.fromMillis(parsedTime);
132131

133132
archiver.configureReproducibleBuild(lastModTime);
133+
134+
archiver.addConfiguredManifest(manifest);
135+
archiver.addDirectory(new File("src/test/resources/java-classes"));
136+
134137
archiver.createArchive();
135138

136139
// zip 2 seconds precision, normalized to UTC
@@ -148,6 +151,45 @@ private void createReproducibleBuild(String timeZoneId) throws IOException, Mani
148151
}
149152
}
150153

154+
/**
155+
* Check group not writable for reproducible archive.
156+
*
157+
* @throws IOException
158+
* @throws ParseException
159+
*/
160+
@Test
161+
public void testReproducibleUmask() throws IOException, ParseException {
162+
Path jarFile = Files.createTempFile(tempDir, "JarArchiverTest-umask", ".jar");
163+
164+
JarArchiver archiver = getJarArchiver();
165+
archiver.setDestFile(jarFile.toFile());
166+
167+
SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
168+
long parsedTime = isoFormat.parse("2038-01-19T03:14:08Z").getTime();
169+
FileTime lastModTime = FileTime.fromMillis(parsedTime);
170+
171+
archiver.configureReproducibleBuild(lastModTime);
172+
173+
archiver.addDirectory(new File("src/test/resources/java-classes"));
174+
archiver.addFile(new File("src/test/resources/world-writable/foo.txt"), "addFile.txt");
175+
176+
archiver.createArchive();
177+
178+
try (org.apache.commons.compress.archivers.zip.ZipFile zip =
179+
new org.apache.commons.compress.archivers.zip.ZipFile(jarFile.toFile())) {
180+
Enumeration<? extends ZipArchiveEntry> entries = zip.getEntries();
181+
while (entries.hasMoreElements()) {
182+
ZipArchiveEntry entry = entries.nextElement();
183+
int mode = entry.getUnixMode();
184+
assertEquals(
185+
0,
186+
mode & 0_020,
187+
entry.getName() + " group should not be writable in reproducible mode: "
188+
+ Integer.toOctalString(mode));
189+
}
190+
}
191+
}
192+
151193
@Override
152194
protected JarArchiver getJarArchiver() {
153195
return new JarArchiver();

0 commit comments

Comments
 (0)