/** * Convert {@link ZTFilePermissions} to POSIX file permission bit array. * * * @param permissions permissions * @return Posix mode */ static int toPosixFileMode(ZTFilePermissions permissions) { int mode = 0; mode |= addFlag(permissions.isOwnerCanExecute(), OWNER_EXECUTE_FLAG); mode |= addFlag(permissions.isGroupCanExecute(), GROUP_EXECUTE_FLAG); mode |= addFlag(permissions.isOthersCanExecute(), OTHERS_EXECUTE_FLAG); mode |= addFlag(permissions.isOwnerCanWrite(), OWNER_WRITE_FLAG); mode |= addFlag(permissions.isGroupCanWrite(), GROUP_WRITE_FLAG); mode |= addFlag(permissions.isOthersCanWrite(), OTHERS_WRITE_FLAG); mode |= addFlag(permissions.isOwnerCanRead(), OWNER_READ_FLAG); mode |= addFlag(permissions.isGroupCanRead(), GROUP_READ_FLAG); mode |= addFlag(permissions.isOthersCanRead(), OTHERS_READ_FLAG); return mode; }
/** * Create new Zip entry and fill it with associated with file meta-info * * @param name Zip entry name * @param file source File * @return newly created Zip entry */ static ZipEntry fromFile(String name, File file) { ZipEntry zipEntry = new ZipEntry(name); if (!file.isDirectory()) { zipEntry.setSize(file.length()); } zipEntry.setTime(file.lastModified()); ZTFilePermissions permissions = ZTFilePermissionsUtil.getDefaultStategy().getPermissions(file); if (permissions != null) { ZipEntryUtil.setZTFilePermissions(zipEntry, permissions); } return zipEntry; }
private static ZTFilePermissionsStrategy fetchDefaultStrategy() { ZTFilePermissionsStrategy strategy = tryInstantiateStrategy(Java7Nio2ApiPermissionsStrategy.class); if (strategy == null) { strategy = tryInstantiateStrategy(Java6FileApiPermissionsStrategy.class); } if (strategy == null) { strategy = NOP_STRATEGY; } return strategy; }
/** * Add file permissions info to ZIP entry. * Current implementation adds "ASi Unix" (tag 0x756e) extra block to entry. * * @param zipEntry ZIP entry * @param permissions permissions to assign */ static boolean setZTFilePermissions(ZipEntry zipEntry, ZTFilePermissions permissions) { try { List<ZipExtraField> fields = ExtraFieldUtils.parse(zipEntry.getExtra()); AsiExtraField asiExtraField = getFirstAsiExtraField(fields); if (asiExtraField == null) { asiExtraField = new AsiExtraField(); fields.add(asiExtraField); } asiExtraField.setDirectory(zipEntry.isDirectory()); asiExtraField.setMode(ZTFilePermissionsUtil.toPosixFileMode(permissions)); zipEntry.setExtra(ExtraFieldUtils.mergeLocalFileDataData(fields)); return true; } catch (java.util.zip.ZipException ze) { return false; } }
/** * Get assigned to ZIP entry file permissions info. Current implementation tries to read "ASi Unix" (tag 0x756e) extra tag. * "ASi Unix" * * @param zipEntry * @return file permissions info or <code>null</code> if ZIP entry does not have "ASi Unix" extra field. */ static ZTFilePermissions getZTFilePermissions(ZipEntry zipEntry) { try { ZTFilePermissions permissions = null; List<ZipExtraField> fields = ExtraFieldUtils.parse(zipEntry.getExtra()); AsiExtraField asiExtraField = getFirstAsiExtraField(fields); if (asiExtraField != null) { int mode = asiExtraField.getMode() & 0777; permissions = ZTFilePermissionsUtil.fromPosixFileMode(mode); } return permissions; } catch (java.util.zip.ZipException ze) { throw new ZipException(ze); } }
/** * Add file permissions info to ZIP entry. * Current implementation adds "ASi Unix" (tag 0x756e) extra block to entry. * * @param zipEntry ZIP entry * @param permissions permissions to assign */ static boolean setZTFilePermissions(ZipEntry zipEntry, ZTFilePermissions permissions) { try { List<ZipExtraField> fields = ExtraFieldUtils.parse(zipEntry.getExtra()); AsiExtraField asiExtraField = getFirstAsiExtraField(fields); if (asiExtraField == null) { asiExtraField = new AsiExtraField(); fields.add(asiExtraField); } asiExtraField.setDirectory(zipEntry.isDirectory()); asiExtraField.setMode(ZTFilePermissionsUtil.toPosixFileMode(permissions)); zipEntry.setExtra(ExtraFieldUtils.mergeLocalFileDataData(fields)); return true; } catch (java.util.zip.ZipException ze) { return false; } }
/** * Get assigned to ZIP entry file permissions info. Current implementation tries to read "ASi Unix" (tag 0x756e) extra tag. * "ASi Unix" * * @param zipEntry * @return file permissions info or <code>null</code> if ZIP entry does not have "ASi Unix" extra field. */ static ZTFilePermissions getZTFilePermissions(ZipEntry zipEntry) { try { ZTFilePermissions permissions = null; List<ZipExtraField> fields = ExtraFieldUtils.parse(zipEntry.getExtra()); AsiExtraField asiExtraField = getFirstAsiExtraField(fields); if (asiExtraField != null) { int mode = asiExtraField.getMode() & 0777; permissions = ZTFilePermissionsUtil.fromPosixFileMode(mode); } return permissions; } catch (java.util.zip.ZipException ze) { throw new ZipException(ze); } }
public void process(InputStream in, ZipEntry zipEntry) throws IOException { String name = mapper.map(zipEntry.getName()); if (name != null) { File file = makeDestinationFile(outputDir, name); if (zipEntry.isDirectory()) { FileUtils.forceMkdir(file); } else { FileUtils.forceMkdir(file.getParentFile()); if (log.isDebugEnabled() && file.exists()) { log.debug("Overwriting file '{}'.", zipEntry.getName()); } FileUtils.copy(in, file); } ZTFilePermissions permissions = ZipEntryUtil.getZTFilePermissions(zipEntry); if (permissions != null) { ZTFilePermissionsUtil.getDefaultStategy().setPermissions(file, permissions); } } } }
private static ZTFilePermissionsStrategy fetchDefaultStrategy() { ZTFilePermissionsStrategy strategy = tryInstantiateStrategy(Java7Nio2ApiPermissionsStrategy.class); if (strategy == null) { strategy = tryInstantiateStrategy(Java6FileApiPermissionsStrategy.class); } if (strategy == null) { strategy = NOP_STRATEGY; } return strategy; }
/** * Convert {@link ZTFilePermissions} to POSIX file permission bit array. * * * @param permissions permissions * @return Posix mode */ static int toPosixFileMode(ZTFilePermissions permissions) { int mode = 0; mode |= addFlag(permissions.isOwnerCanExecute(), OWNER_EXECUTE_FLAG); mode |= addFlag(permissions.isGroupCanExecute(), GROUP_EXECUTE_FLAG); mode |= addFlag(permissions.isOthersCanExecute(), OTHERS_EXECUTE_FLAG); mode |= addFlag(permissions.isOwnerCanWrite(), OWNER_WRITE_FLAG); mode |= addFlag(permissions.isGroupCanWrite(), GROUP_WRITE_FLAG); mode |= addFlag(permissions.isOthersCanWrite(), OTHERS_WRITE_FLAG); mode |= addFlag(permissions.isOwnerCanRead(), OWNER_READ_FLAG); mode |= addFlag(permissions.isGroupCanRead(), GROUP_READ_FLAG); mode |= addFlag(permissions.isOthersCanRead(), OTHERS_READ_FLAG); return mode; }
/** * Create new Zip entry and fill it with associated with file meta-info * * @param name Zip entry name * @param file source File * @return newly created Zip entry */ static ZipEntry fromFile(String name, File file) { ZipEntry zipEntry = new ZipEntry(name); if (!file.isDirectory()) { zipEntry.setSize(file.length()); } zipEntry.setTime(file.lastModified()); ZTFilePermissions permissions = ZTFilePermissionsUtil.getDefaultStategy().getPermissions(file); if (permissions != null) { ZipEntryUtil.setZTFilePermissions(zipEntry, permissions); } return zipEntry; }
public void process(InputStream in, ZipEntry zipEntry) throws IOException { String name = mapper.map(zipEntry.getName()); if (name != null) { File file = new File(outputDir, name); /* If we see the relative traversal string of ".." we need to make sure * that the outputdir + name doesn't leave the outputdir. See * DirectoryTraversalMaliciousTest for details. */ if (name.indexOf("..") != -1 && !file.getCanonicalPath().startsWith(outputDir.getCanonicalPath())) { throw new ZipException("The file "+name+" is trying to leave the target output directory of "+outputDir+". Ignoring this file."); } if (zipEntry.isDirectory()) { FileUtils.forceMkdir(file); } else { FileUtils.forceMkdir(file.getParentFile()); if (log.isDebugEnabled() && file.exists()) { log.debug("Overwriting file '{}'.", zipEntry.getName()); } FileUtils.copy(in, file); } ZTFilePermissions permissions = ZipEntryUtil.getZTFilePermissions(zipEntry); if (permissions != null) { ZTFilePermissionsUtil.getDefaultStategy().setPermissions(file, permissions); } } } }