Skip to content

Commit

Permalink
The permissions of scripts getting changed #48
Browse files Browse the repository at this point in the history
  • Loading branch information
xonixx committed Sep 11, 2024
1 parent bc4e7d1 commit b94a238
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 7 deletions.
42 changes: 36 additions & 6 deletions src/main/java/com/cmlteam/serv/TarUtil.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
package com.cmlteam.serv;

import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;
import org.apache.commons.io.IOUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.attribute.PosixFilePermission;
import java.util.Map;
import java.util.Set;
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;
import org.apache.commons.io.IOUtils;

class TarUtil {

Expand Down Expand Up @@ -61,7 +63,9 @@ private static void addToArchiveCompression(

String entry = dir + File.separator + file.getName();
if (file.isFile()) {
out.putArchiveEntry(new TarArchiveEntry(file, entry));
TarArchiveEntry archiveEntry = new TarArchiveEntry(file, entry);
archiveEntry.setMode(calcPermissions(file));
out.putArchiveEntry(archiveEntry);
try (FileInputStream in = new FileInputStream(file)) {
IOUtils.copy(in, out);
}
Expand All @@ -77,4 +81,30 @@ private static void addToArchiveCompression(
System.err.println("warning: not supported (symlink?): " + file);
}
}

private static final Map<PosixFilePermission, Integer> permToShift =
Map.ofEntries(
Map.entry(PosixFilePermission.OWNER_READ, 8),
Map.entry(PosixFilePermission.OWNER_WRITE, 7),
Map.entry(PosixFilePermission.OWNER_EXECUTE, 6),
Map.entry(PosixFilePermission.GROUP_READ, 5),
Map.entry(PosixFilePermission.GROUP_WRITE, 4),
Map.entry(PosixFilePermission.GROUP_EXECUTE, 3),
Map.entry(PosixFilePermission.OTHERS_READ, 2),
Map.entry(PosixFilePermission.OTHERS_WRITE, 1),
Map.entry(PosixFilePermission.OTHERS_EXECUTE, 0));

static int calcPermissions(File file) throws IOException {
Set<String> availableAttributeViews =
file.toPath().getFileSystem().supportedFileAttributeViews();
int res = TarArchiveEntry.DEFAULT_FILE_MODE;
if (availableAttributeViews.contains("posix")) {
Set<PosixFilePermission> permissions = Files.getPosixFilePermissions(file.toPath());
res = 0100000;
for (PosixFilePermission permission : permissions) {
res |= 1 << permToShift.get(permission);
}
}
return res;
}
}
2 changes: 1 addition & 1 deletion src/test/java/com/cmlteam/serv/FileExtractUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public static void extractTarOrTgz(File tarOrTgzFile, File outDir) {
try (InputStream inputStream = _inputStream;
TarArchiveInputStream tarIs = new TarArchiveInputStream(inputStream)) {
TarArchiveEntry entry;
while ((entry = (TarArchiveEntry) tarIs.getNextEntry()) != null) {
while ((entry = tarIs.getNextEntry()) != null) {
String name = entry.getName();
if (entry.isDirectory()) {
mkDirs(outDir, name);
Expand Down
2 changes: 2 additions & 0 deletions src/test/java/com/cmlteam/serv/SharingTests.java
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,7 @@ void testPreserveScriptsPermissions_issue48(@TempDir Path tempDir) throws IOExce
Path file1 = createTestFile(inputFolder, fname1, "#!/bin/sh\necho 123\n");

assertEquals(0, TestsUtil.exec("chmod", "+x", file1.toFile().getAbsolutePath()));
assertEquals(0, TestsUtil.exec("ls", "-l", file1.toFile().getAbsolutePath())); // show perms
// assertEquals(0, TestsUtil.exec(file1.toFile().getAbsolutePath()));

serv =
Expand All @@ -211,6 +212,7 @@ void testPreserveScriptsPermissions_issue48(@TempDir Path tempDir) throws IOExce

Path file1Res = resultExtractedFolder.resolve(fname1);
assertFilesEqual(file1, file1Res);
assertEquals(0, TestsUtil.exec("tar", "-tvf", resultFile.getAbsolutePath())); // show perms in tar
assertEquals(0, TestsUtil.exec("ls", "-l", file1Res.toFile().getAbsolutePath())); // show perms
assertEquals(0, TestsUtil.exec(file1Res.toFile().getAbsolutePath())); // is still executable
}
Expand Down

0 comments on commit b94a238

Please sign in to comment.