Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions epub4j-core/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ plugins {
dependencies {
implementation("net.sf.kxml:kxml2:2.3.0")
implementation("xmlpull:xmlpull:1.1.3.4d_b4_min")
api("net.lingala.zip4j:zip4j:2.11.5")
}

gversion {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,9 @@
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
import net.sf.jazzlib.ZipFile;
import net.sf.jazzlib.ZipInputStream;

import net.lingala.zip4j.ZipFile;
import net.lingala.zip4j.io.inputstream.ZipInputStream;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,30 +1,23 @@
package io.documentnode.epub4j.epub;

import io.documentnode.epub4j.domain.EpubResourceProvider;
import io.documentnode.epub4j.domain.LazyResource;
import io.documentnode.epub4j.domain.LazyResourceProvider;
import io.documentnode.epub4j.domain.MediaType;
import io.documentnode.epub4j.domain.MediaTypes;
import io.documentnode.epub4j.domain.Resource;
import io.documentnode.epub4j.domain.Resources;
import io.documentnode.epub4j.domain.*;
import io.documentnode.epub4j.util.CollectionUtil;
import io.documentnode.epub4j.util.ResourceUtil;
import io.documentnode.minilog.Logger;
import net.lingala.zip4j.ZipFile;
import net.lingala.zip4j.io.inputstream.ZipInputStream;
import net.lingala.zip4j.model.FileHeader;
import net.lingala.zip4j.model.LocalFileHeader;

import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
import net.sf.jazzlib.ZipEntry;
import net.sf.jazzlib.ZipException;
import net.sf.jazzlib.ZipFile;
import net.sf.jazzlib.ZipInputStream;

/**
* Loads Resources from inputStreams, ZipFiles, etc
*
* @author paul
*
*/
public class ResourcesLoader {

Expand All @@ -48,24 +41,23 @@ public static Resources loadResources(ZipFile zipFile,
List<MediaType> lazyLoadedTypes) throws IOException {

LazyResourceProvider resourceProvider =
new EpubResourceProvider(zipFile.getName());
new EpubResourceProvider(zipFile.getFile().getAbsolutePath());

Resources result = new Resources();
Enumeration<? extends ZipEntry> entries = zipFile.entries();
var entries = zipFile.getFileHeaders();

while (entries.hasMoreElements()) {
ZipEntry zipEntry = entries.nextElement();
for (FileHeader zipEntry : entries) {

if (zipEntry == null || zipEntry.isDirectory()) {
continue;
}

String href = zipEntry.getName();
String href = zipEntry.getFileName();

Resource resource;

if (shouldLoadLazy(href, lazyLoadedTypes)) {
resource = new LazyResource(resourceProvider, zipEntry.getSize(), href);
resource = new LazyResource(resourceProvider, zipEntry.getUncompressedSize(), href);
} else {
resource = ResourceUtil
.createResource(zipEntry, zipFile.getInputStream(zipEntry));
Expand Down Expand Up @@ -113,7 +105,7 @@ private static boolean shouldLoadLazy(String href,
public static Resources loadResources(ZipInputStream zipInputStream,
String defaultHtmlEncoding) throws IOException {
Resources result = new Resources();
ZipEntry zipEntry;
LocalFileHeader zipEntry;
do {
// get next valid zipEntry
zipEntry = getNextZipEntry(zipInputStream);
Expand All @@ -133,19 +125,15 @@ public static Resources loadResources(ZipInputStream zipInputStream,
}


private static ZipEntry getNextZipEntry(ZipInputStream zipInputStream)
private static LocalFileHeader getNextZipEntry(ZipInputStream zipInputStream)
throws IOException {
try {
return zipInputStream.getNextEntry();
} catch (ZipException e) {
} catch (IOException e) {
//see <a href="https://github.com/psiegman/epublib/issues/122">Issue #122 Infinite loop</a>.
//when reading a file that is not a real zip archive or a zero length file, zipInputStream.getNextEntry()
//throws an exception and does not advance, so loadResources enters an infinite loop
log.error("Invalid or damaged zip file.", e);
try {
zipInputStream.closeEntry();
} catch (Exception ignored) {
}
throw e;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,20 @@

import io.documentnode.epub4j.Constants;
import io.documentnode.epub4j.domain.MediaType;
import io.documentnode.epub4j.domain.MediaTypes;
import io.documentnode.epub4j.domain.Resource;
import io.documentnode.epub4j.epub.EpubProcessorSupport;
import io.documentnode.epub4j.domain.MediaTypes;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
import net.sf.jazzlib.ZipEntry;
import net.sf.jazzlib.ZipInputStream;
import net.lingala.zip4j.io.inputstream.ZipInputStream;
import net.lingala.zip4j.model.FileHeader;
import net.lingala.zip4j.model.LocalFileHeader;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
import java.io.*;

/**
* Various resource utility methods
*
Expand Down Expand Up @@ -60,15 +57,14 @@ public static Resource createResource(String title, String href) {
* @return a resource created out of the given zipEntry and zipInputStream.
* @throws IOException
*/
public static Resource createResource(ZipEntry zipEntry,
ZipInputStream zipInputStream) throws IOException {
return new Resource(zipInputStream, zipEntry.getName());
public static Resource createResource(LocalFileHeader zipEntry,
ZipInputStream zipInputStream) throws IOException {
return new Resource(zipInputStream, zipEntry.getFileName());

}

public static Resource createResource(ZipEntry zipEntry,
InputStream zipInputStream) throws IOException {
return new Resource(zipInputStream, zipEntry.getName());
public static Resource createResource(FileHeader zipEntry,
ZipInputStream zipInputStream) throws IOException {
return new Resource(zipInputStream, zipEntry.getFileName());

}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package io.documentnode.epub4j.epub;

import io.documentnode.epub4j.domain.LazyResource;
import io.documentnode.epub4j.domain.Resource;
import io.documentnode.epub4j.domain.Resources;
import io.documentnode.epub4j.domain.MediaTypes;
import io.documentnode.epub4j.domain.*;
import io.documentnode.epub4j.util.IOUtil;
import java.io.File;
import java.io.FileInputStream;
Expand All @@ -14,9 +11,10 @@
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import net.sf.jazzlib.ZipException;
import net.sf.jazzlib.ZipFile;
import net.sf.jazzlib.ZipInputStream;

import net.lingala.zip4j.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.io.inputstream.ZipInputStream;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
Expand Down Expand Up @@ -81,15 +79,18 @@ public void testLoadResources_ZipInputStream_WithZeroLengthFile()
* Loads the Resources from a file that is not a valid zip, using ZipInputStream<br/>
* See <a href="https://github.com/psiegman/epublib/issues/122">Issue #122 Infinite loop</a>.
*/
@Test(expected = ZipException.class)
@Test
public void testLoadResources_ZipInputStream_WithInvalidFile()
throws IOException {
// given
ZipInputStream zipInputStream = new ZipInputStream(
this.getClass().getResourceAsStream("/not_a_zip.epub"));

// when
ResourcesLoader.loadResources(zipInputStream, encoding);
Resources resources = ResourcesLoader.loadResources(zipInputStream, encoding);

// then
Assert.assertEquals(0, resources.getAll().size());
}

/**
Expand Down
Loading