Merge pull request #10929 from atmire/w2p-132206_saf-inputstream-leaks

Fix SAF Import Open connection leak
This commit is contained in:
Tim Donohue
2025-09-10 14:26:34 -05:00
committed by GitHub
2 changed files with 57 additions and 40 deletions

View File

@@ -23,6 +23,7 @@ import java.util.UUID;
import org.apache.commons.cli.ParseException; import org.apache.commons.cli.ParseException;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.tika.Tika; import org.apache.tika.Tika;
import org.dspace.app.itemimport.factory.ItemImportServiceFactory; import org.dspace.app.itemimport.factory.ItemImportServiceFactory;
@@ -334,33 +335,38 @@ public class ItemImport extends DSpaceRunnable<ItemImportScriptConfiguration> {
protected void readZip(Context context, ItemImportService itemImportService) throws Exception { protected void readZip(Context context, ItemImportService itemImportService) throws Exception {
Optional<InputStream> optionalFileStream = Optional.empty(); Optional<InputStream> optionalFileStream = Optional.empty();
Optional<InputStream> validationFileStream = Optional.empty(); Optional<InputStream> validationFileStream = Optional.empty();
if (!remoteUrl) { try {
// manage zip via upload if (!remoteUrl) {
optionalFileStream = handler.getFileStream(context, zipfilename); // manage zip via upload
validationFileStream = handler.getFileStream(context, zipfilename); optionalFileStream = handler.getFileStream(context, zipfilename);
} else { validationFileStream = handler.getFileStream(context, zipfilename);
// manage zip via remote url } else {
optionalFileStream = Optional.ofNullable(new URL(zipfilename).openStream()); // manage zip via remote url
validationFileStream = Optional.ofNullable(new URL(zipfilename).openStream()); optionalFileStream = Optional.ofNullable(new URL(zipfilename).openStream());
} validationFileStream = Optional.ofNullable(new URL(zipfilename).openStream());
if (validationFileStream.isPresent()) {
// validate zip file
if (validationFileStream.isPresent()) {
validateZip(validationFileStream.get());
} }
workFile = new File(itemImportService.getTempWorkDir() + File.separator if (validationFileStream.isPresent()) {
+ zipfilename + "-" + context.getCurrentUser().getID()); // validate zip file
FileUtils.copyInputStreamToFile(optionalFileStream.get(), workFile); if (validationFileStream.isPresent()) {
} else { validateZip(validationFileStream.get());
throw new IllegalArgumentException( }
"Error reading file, the file couldn't be found for filename: " + zipfilename);
}
workDir = new File(itemImportService.getTempWorkDir() + File.separator + TEMP_DIR workFile = new File(itemImportService.getTempWorkDir() + File.separator
+ File.separator + context.getCurrentUser().getID()); + zipfilename + "-" + context.getCurrentUser().getID());
sourcedir = itemImportService.unzip(workFile, workDir.getAbsolutePath()); FileUtils.copyInputStreamToFile(optionalFileStream.get(), workFile);
} else {
throw new IllegalArgumentException(
"Error reading file, the file couldn't be found for filename: " + zipfilename);
}
workDir = new File(itemImportService.getTempWorkDir() + File.separator + TEMP_DIR
+ File.separator + context.getCurrentUser().getID());
sourcedir = itemImportService.unzip(workFile, workDir.getAbsolutePath());
} finally {
optionalFileStream.ifPresent(IOUtils::closeQuietly);
validationFileStream.ifPresent(IOUtils::closeQuietly);
}
} }
/** /**

View File

@@ -17,6 +17,7 @@ import java.util.Optional;
import java.util.UUID; import java.util.UUID;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.dspace.app.itemimport.service.ItemImportService; import org.dspace.app.itemimport.service.ItemImportService;
import org.dspace.content.Collection; import org.dspace.content.Collection;
@@ -111,7 +112,11 @@ public class ItemImportCLI extends ItemImport {
// validate zip file // validate zip file
InputStream validationFileStream = new FileInputStream(myZipFile); InputStream validationFileStream = new FileInputStream(myZipFile);
validateZip(validationFileStream); try {
validateZip(validationFileStream);
} finally {
IOUtils.closeQuietly(validationFileStream);
}
workDir = new File(itemImportService.getTempWorkDir() + File.separator + TEMP_DIR workDir = new File(itemImportService.getTempWorkDir() + File.separator + TEMP_DIR
+ File.separator + context.getCurrentUser().getID()); + File.separator + context.getCurrentUser().getID());
@@ -120,22 +125,28 @@ public class ItemImportCLI extends ItemImport {
} else { } else {
// manage zip via remote url // manage zip via remote url
Optional<InputStream> optionalFileStream = Optional.ofNullable(new URL(zipfilename).openStream()); Optional<InputStream> optionalFileStream = Optional.ofNullable(new URL(zipfilename).openStream());
if (optionalFileStream.isPresent()) { Optional<InputStream> validationFileStream = Optional.ofNullable(new URL(zipfilename).openStream());
// validate zip file via url try {
Optional<InputStream> validationFileStream = Optional.ofNullable(new URL(zipfilename).openStream()); if (optionalFileStream.isPresent()) {
if (validationFileStream.isPresent()) { // validate zip file via url
validateZip(validationFileStream.get());
}
workFile = new File(itemImportService.getTempWorkDir() + File.separator if (validationFileStream.isPresent()) {
+ zipfilename + "-" + context.getCurrentUser().getID()); validateZip(validationFileStream.get());
FileUtils.copyInputStreamToFile(optionalFileStream.get(), workFile); }
workDir = new File(itemImportService.getTempWorkDir() + File.separator + TEMP_DIR
+ File.separator + context.getCurrentUser().getID()); workFile = new File(itemImportService.getTempWorkDir() + File.separator
sourcedir = itemImportService.unzip(workFile, workDir.getAbsolutePath()); + zipfilename + "-" + context.getCurrentUser().getID());
} else { FileUtils.copyInputStreamToFile(optionalFileStream.get(), workFile);
throw new IllegalArgumentException( workDir = new File(itemImportService.getTempWorkDir() + File.separator + TEMP_DIR
"Error reading file, the file couldn't be found for filename: " + zipfilename); + File.separator + context.getCurrentUser().getID());
sourcedir = itemImportService.unzip(workFile, workDir.getAbsolutePath());
} else {
throw new IllegalArgumentException(
"Error reading file, the file couldn't be found for filename: " + zipfilename);
}
} finally {
optionalFileStream.ifPresent(IOUtils::closeQuietly);
validationFileStream.ifPresent(IOUtils::closeQuietly);
} }
} }
} }