permissions for archives fixed
This commit is contained in:
parent
4ca854f6c2
commit
74af9c49d7
@ -13,11 +13,15 @@ import java.io.InputStream;
|
|||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.nio.file.FileSystems;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.attribute.PosixFilePermission;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
import java.util.zip.ZipEntry;
|
import java.util.zip.ZipEntry;
|
||||||
@ -1213,6 +1217,39 @@ public class FileOperations {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void applyPosixPermissions(File file, int mode) {
|
||||||
|
if (mode <= 0) return;
|
||||||
|
if (!FileSystems.getDefault().supportedFileAttributeViews().contains("posix")) return;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// mode for Unix is usually the last 9 bits (0777)
|
||||||
|
// But some sources might provide more (sticky bits, types, etc.)
|
||||||
|
// We focus on the standard 9-bit permission mask
|
||||||
|
int permissionMask = mode & 0777;
|
||||||
|
|
||||||
|
Set<PosixFilePermission> permissions = new HashSet<>();
|
||||||
|
|
||||||
|
// Check OWNER (0700)
|
||||||
|
if ((permissionMask & 0400) != 0) permissions.add(PosixFilePermission.OWNER_READ);
|
||||||
|
if ((permissionMask & 0200) != 0) permissions.add(PosixFilePermission.OWNER_WRITE);
|
||||||
|
if ((permissionMask & 0100) != 0) permissions.add(PosixFilePermission.OWNER_EXECUTE);
|
||||||
|
|
||||||
|
// Check GROUP (0070)
|
||||||
|
if ((permissionMask & 0040) != 0) permissions.add(PosixFilePermission.GROUP_READ);
|
||||||
|
if ((permissionMask & 0020) != 0) permissions.add(PosixFilePermission.GROUP_WRITE);
|
||||||
|
if ((permissionMask & 0010) != 0) permissions.add(PosixFilePermission.GROUP_EXECUTE);
|
||||||
|
|
||||||
|
// Check OTHERS (0007)
|
||||||
|
if ((permissionMask & 0004) != 0) permissions.add(PosixFilePermission.OTHERS_READ);
|
||||||
|
if ((permissionMask & 0002) != 0) permissions.add(PosixFilePermission.OTHERS_WRITE);
|
||||||
|
if ((permissionMask & 0001) != 0) permissions.add(PosixFilePermission.OTHERS_EXECUTE);
|
||||||
|
|
||||||
|
Files.setPosixFilePermissions(file.toPath(), permissions);
|
||||||
|
} catch (Exception e) {
|
||||||
|
// Best effort
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extract ZIP/JAR/WAR by first loading archive bytes to memory and then
|
* Extract ZIP/JAR/WAR by first loading archive bytes to memory and then
|
||||||
* reading entries from ZipInputStream.
|
* reading entries from ZipInputStream.
|
||||||
@ -1289,6 +1326,18 @@ public class FileOperations {
|
|||||||
if (callback != null && callback.isCancelled()) break;
|
if (callback != null && callback.isCancelled()) break;
|
||||||
net.lingala.zip4j.model.FileHeader header = headers.get(i);
|
net.lingala.zip4j.model.FileHeader header = headers.get(i);
|
||||||
zipFile.extractFile(header, targetDir.getAbsolutePath());
|
zipFile.extractFile(header, targetDir.getAbsolutePath());
|
||||||
|
|
||||||
|
// Preserve permissions for Linux/Unix
|
||||||
|
byte[] externalAttributes = header.getExternalFileAttributes();
|
||||||
|
if (externalAttributes != null && externalAttributes.length >= 4) {
|
||||||
|
// Unix mode is stored in the upper 16 bits of the external file attributes
|
||||||
|
int mode = ((externalAttributes[3] & 0xFF) << 8) | (externalAttributes[2] & 0xFF);
|
||||||
|
if (mode > 0) {
|
||||||
|
File extractedFile = new File(targetDir, header.getFileName());
|
||||||
|
applyPosixPermissions(extractedFile, mode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (callback != null) {
|
if (callback != null) {
|
||||||
callback.onProgress(i + 1, total, header.getFileName());
|
callback.onProgress(i + 1, total, header.getFileName());
|
||||||
}
|
}
|
||||||
@ -1429,6 +1478,15 @@ public class FileOperations {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Preserve permissions for Linux/Unix
|
||||||
|
int mode = entry.getMode();
|
||||||
|
if (mode > 0) {
|
||||||
|
// For TAR entries, if high bits are set (directory/file type info),
|
||||||
|
// we ensure we are looking at the standard permission bits.
|
||||||
|
applyPosixPermissions(targetFile, mode);
|
||||||
|
}
|
||||||
|
|
||||||
if (callback != null) {
|
if (callback != null) {
|
||||||
callback.onProgress(0, 0, entry.getName()); // 0/0 because we don't know total
|
callback.onProgress(0, 0, entry.getName()); // 0/0 because we don't know total
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user