opendj-server-legacy/src/main/java/org/forgerock/opendj/server/embedded/EmbeddedDirectoryServer.java
@@ -25,6 +25,8 @@ import java.io.IOException; import java.io.OutputStream; import java.nio.file.Paths; import java.util.Arrays; import java.util.List; import org.forgerock.i18n.LocalizableMessage; import org.forgerock.opendj.adapter.server3x.Adapters; @@ -61,6 +63,13 @@ private static final String QUICKSETUP_ROOT_PROPERTY = "org.opends.quicksetup.Root"; private static final String QUICKSETUP_INSTANCE_PROPERTY = "org.opends.quicksetup.instance"; /** List of directories resulting from the OpenDJ archive where all files should be set as executable. */ private static final List<String> EXECUTABLE_DJ_DIRECTORIES = Arrays.asList("opendj/bin"); /** List of individual files resulting from the OpenDJ archive which should be set as executable. */ private static final List<String> EXECUTABLE_DJ_FILES = Arrays.asList("opendj/setup", "opendj/upgrade", "opendj/uninstall", "opendj/setup.bat", "opendj/upgrade.bat", "opendj/uninstall.bat"); /** The parameters for install and instance directories, and configuration file of the server. */ private final ConfigParameters configParams; @@ -443,7 +452,7 @@ } // the directory where the zip file is extracted should be one level up from the server root. File deployDirectory = serverRoot.getParentFile(); StaticUtils.extractZipArchive(openDJZipFile, deployDirectory); StaticUtils.extractZipArchive(openDJZipFile, deployDirectory, EXECUTABLE_DJ_DIRECTORIES, EXECUTABLE_DJ_FILES); } catch (IOException e) { opendj-server-legacy/src/main/java/org/opends/server/util/StaticUtils.java
@@ -95,6 +95,8 @@ /** Size of buffer used to copy/move/extract files. */ public static final int BUFFER_SIZE = 8192; private static final String[] EXECUTABLE_FILES_SUFFIXES = { ".sh", ".bat", ".exe" }; /** * Number of bytes in a Kibibyte. * <p> @@ -2487,16 +2489,28 @@ /** * Extracts the provided zip archive to the provided target directory. * <p> * Archive files ending by "sh" or beginning by "bin" are set as executable files. * A file is set to executable if one or more of the following three conditions apply: * <ul> * <li>It ends with a suffix identified as executable file suffix (.sh, .bat, .exe)</li> * <li>It is listed in the provided executableFiles</li> * <li>It is included in a directory that is listed in the provided executableDirectories</li> * </ul> * * @param zipFile * The zip file to extract. * @param targetDirectory * The target directory for the content of the archive. * @param executableDirectories * List of extracted directories which should have all their files set as executable. * Each directory must be provided as a path relative to the target directory (e.g. "opendj/bin") * @param executableFiles * List of individual files which should be set as executable. * Each file must be provided as a path relative to the target directory (e.g. "opendj/setup") * @throws IOException * If zip archive can't be read or target files can be written. */ public static void extractZipArchive(File zipFile, File targetDirectory) throws IOException public static void extractZipArchive(File zipFile, File targetDirectory, List<String> executableDirectories, List<String> executableFiles) throws IOException { try (ZipInputStream zipStream = new ZipInputStream(new FileInputStream(zipFile))) { @@ -2512,13 +2526,34 @@ } extractFileFromZip(zipStream, targetFile); if (fileEntry.getName().endsWith("sh") || fileEntry.getName().startsWith("bin")) for (String suffix : EXECUTABLE_FILES_SUFFIXES) { if (fileEntry.getName().toLowerCase().endsWith(suffix)) { targetFile.setExecutable(true); } } } } for (String dir: executableDirectories) { File directory = new File(targetDirectory.getPath(), dir); for (File file: directory.listFiles()) { if (file.isFile()) { file.setExecutable(true); } } } for (String name : executableFiles) { File file = new File(targetDirectory.getPath(), name); if (file.exists()) { file.setExecutable(true); } } } /** * Extracts a file from a zip input stream. opendj-server-legacy/src/test/java/org/forgerock/server/embedded/EmbeddedDirectoryServerTestCase.java
@@ -102,6 +102,7 @@ assertTrue(server.isRunning()); } @Test public void testReadConfigurationOffline() throws Exception { EmbeddedDirectoryServer server = getServer(); @@ -125,11 +126,13 @@ } } @Test public void testReadConfigurationOnline() throws Exception { readConfiguration(getServer()); } @Test public void testUpdateConfiguration() throws Exception { EmbeddedDirectoryServer server = getServer(); @@ -157,6 +160,7 @@ * This test only ensures that the rebuild index process is correctly launched and does not fail. * There is no assertions. */ @Test public void testRebuildIndexOffline() throws Exception { EmbeddedDirectoryServer server = getServer(); @@ -182,6 +186,7 @@ * This test only ensures that the upgrade index is correctly launched and does not fail. * There is no assertions. */ @Test public void testUpgradeOffline() throws Exception { EmbeddedDirectoryServer server = getServer(); @@ -200,11 +205,13 @@ * This test only ensures that the upgrade index is correctly launched and does not fail. * There is no assertions. */ @Test public void testUpgradeOnline() throws Exception { getServer().upgrade(upgradeParams().isIgnoreErrors(false)); } @Test public void testImportDataOnline() throws Exception { EmbeddedDirectoryServer server = getServer(); @@ -231,6 +238,7 @@ } } @Test public void testSetupFromArchive() throws Exception { EmbeddedDirectoryServer server = getServer(); @@ -269,5 +277,4 @@ server.start(); } } }