Skip to content

Commit 4c50a6a

Browse files
Outputstreams refractor
1 parent b48a9d9 commit 4c50a6a

32 files changed

Lines changed: 1061 additions & 907 deletions

src/main/java/net/lingala/zip4j/crypto/AESDecrypter.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,7 @@ public class AESDecrypter implements Decrypter {
5151
private byte[] counterBlock;
5252
private int loopCount = 0;
5353

54-
public AESDecrypter(LocalFileHeader localFileHeader,
55-
byte[] salt, byte[] passwordVerifier) throws ZipException {
54+
public AESDecrypter(LocalFileHeader localFileHeader, byte[] salt, byte[] passwordVerifier) throws ZipException {
5655

5756
if (localFileHeader == null) {
5857
throw new ZipException("one of the input parameters is null in AESDecryptor Constructor");

src/main/java/net/lingala/zip4j/crypto/Encrypter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020

2121
public interface Encrypter {
2222

23-
public int encryptData(byte[] buff) throws ZipException;
23+
int encryptData(byte[] buff) throws ZipException;
2424

25-
public int encryptData(byte[] buff, int start, int len) throws ZipException;
25+
int encryptData(byte[] buff, int start, int len) throws ZipException;
2626

2727
}

src/main/java/net/lingala/zip4j/crypto/StandardEncrypter.java

Lines changed: 2 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,7 @@ public class StandardEncrypter implements Encrypter {
2828
private byte[] headerBytes;
2929

3030
public StandardEncrypter(char[] password, int crc) throws ZipException {
31-
if (password == null || password.length <= 0) {
32-
throw new ZipException("input password is null or empty in standard encrpyter constructor");
33-
}
34-
35-
this.zipCryptoEngine = new ZipCryptoEngine();
31+
this.zipCryptoEngine = new ZipCryptoEngine();
3632

3733
this.headerBytes = new byte[InternalZipConstants.STD_DEC_HDR_SIZE];
3834
init(password, crc);
@@ -97,32 +93,9 @@ protected byte[] generateRandomBytes(int size) throws ZipException {
9793
Random rand = new Random();
9894

9995
for (int i = 0; i < buff.length; i++) {
100-
// Encrypted to get less predictability for poorly implemented
101-
// rand functions.
96+
// Encrypted to get less predictability for poorly implemented rand functions.
10297
buff[i] = encryptByte((byte) rand.nextInt(256));
10398
}
104-
105-
// buff[0] = (byte)87;
106-
// buff[1] = (byte)176;
107-
// buff[2] = (byte)-49;
108-
// buff[3] = (byte)-43;
109-
// buff[4] = (byte)93;
110-
// buff[5] = (byte)-204;
111-
// buff[6] = (byte)-105;
112-
// buff[7] = (byte)213;
113-
// buff[8] = (byte)-80;
114-
// buff[9] = (byte)-8;
115-
// buff[10] = (byte)21;
116-
// buff[11] = (byte)242;
117-
118-
// for( int j=0; j<2; j++ ) {
119-
// Random rand = new Random();
120-
// int i = rand.nextInt();
121-
// buff[0+j*4] = (byte)(i>>24);
122-
// buff[1+j*4] = (byte)(i>>16);
123-
// buff[2+j*4] = (byte)(i>>8);
124-
// buff[3+j*4] = (byte)i;
125-
// }
12699
return buff;
127100
}
128101

src/main/java/net/lingala/zip4j/headers/FileHeaderFactory.java

Lines changed: 14 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,10 @@
1212
import net.lingala.zip4j.zip.CompressionMethod;
1313
import net.lingala.zip4j.zip.EncryptionMethod;
1414

15-
import java.io.File;
16-
1715
public class FileHeaderFactory {
1816

1917
public FileHeader generateFileHeader(ZipParameters zipParameters, boolean isSplitZip, int currentDiskNumberStart,
20-
String fileNameCharset, File sourceFile) throws ZipException {
18+
String fileNameCharset) throws ZipException {
2119

2220
FileHeader fileHeader = new FileHeader();
2321
fileHeader.setSignature((int) InternalZipConstants.CENSIG);
@@ -36,27 +34,21 @@ public FileHeader generateFileHeader(ZipParameters zipParameters, boolean isSpli
3634
fileHeader.setEncryptionMethod(zipParameters.getEncryptionMethod());
3735
}
3836

39-
String fileName = getFileName(zipParameters, fileHeader, sourceFile);
37+
String fileName = validateAndGetFileName(zipParameters.getFileNameInZip());
4038
fileHeader.setFileName(fileName);
4139
fileHeader.setFileNameLength(determineFileNameLength(fileName, fileNameCharset));
42-
fileHeader.setDiskNumberStart(isSplitZip ? currentDiskNumberStart: 0);
43-
44-
byte[] externalFileAttrs = {(byte) getFileAttributes(zipParameters.isSourceExternalStream(), sourceFile), 0, 0, 0};
45-
fileHeader.setExternalFileAttr(externalFileAttrs);
46-
47-
fileHeader.setDirectory(isDirectory(fileName, zipParameters.isSourceExternalStream(), sourceFile));
40+
fileHeader.setDiskNumberStart(isSplitZip ? currentDiskNumberStart : 0);
4841

49-
if (fileHeader.isDirectory()) {
50-
fileHeader.setCompressedSize(0);
51-
fileHeader.setUncompressedSize(0);
42+
if (zipParameters.getLastModifiedFileTime() > 0) {
43+
fileHeader.setLastModifiedTime((int) Zip4jUtil.javaToDosTime(zipParameters.getLastModifiedFileTime()));
5244
} else {
53-
if (!zipParameters.isSourceExternalStream()) {
54-
long fileSize = Zip4jUtil.getFileLengh(sourceFile);
55-
fileHeader.setCompressedSize(calculateCompressedSize(zipParameters, fileSize));
56-
fileHeader.setUncompressedSize(fileSize);
57-
}
45+
fileHeader.setLastModifiedTime((int) Zip4jUtil.javaToDosTime(System.currentTimeMillis()));
5846
}
5947

48+
//TODO add file atttributes for interally added files
49+
fileHeader.setExternalFileAttr(new byte[] {0, 0, 0, 0});
50+
fileHeader.setDirectory(Zip4jUtil.isZipEntryDirectory(fileName));
51+
6052
if (zipParameters.isEncryptFiles() && zipParameters.getEncryptionMethod() == EncryptionMethod.ZIP_STANDARD) {
6153
fileHeader.setCrc32(zipParameters.getSourceFileCRC());
6254
}
@@ -101,23 +93,11 @@ private byte[] determineGeneralPurposeBitFlag(String fileNameCharset, boolean is
10193
return generalPurposeBitFlag;
10294
}
10395

104-
private String getFileName(ZipParameters zipParameters, FileHeader fileHeader, File sourceFile) throws ZipException {
105-
String fileName;
106-
if (zipParameters.isSourceExternalStream()) {
107-
fileHeader.setLastModifiedTime((int) Zip4jUtil.javaToDosTime(System.currentTimeMillis()));
108-
if (!Zip4jUtil.isStringNotNullAndNotEmpty(zipParameters.getFileNameInZip())) {
109-
throw new ZipException("fileNameInZip is null or empty");
110-
}
111-
fileName = zipParameters.getFileNameInZip();
112-
} else {
113-
fileHeader.setLastModifiedTime((int) Zip4jUtil.javaToDosTime((Zip4jUtil.getLastModifiedFileTime(
114-
sourceFile, zipParameters.getTimeZone()))));
115-
fileHeader.setUncompressedSize(sourceFile.length());
116-
fileName = Zip4jUtil.getRelativeFileName(
117-
sourceFile.getAbsolutePath(), zipParameters.getRootFolderInZip(), zipParameters.getDefaultFolderPath());
96+
private String validateAndGetFileName(String fileNameInZip) throws ZipException {
97+
if (!Zip4jUtil.isStringNotNullAndNotEmpty(fileNameInZip)) {
98+
throw new ZipException("fileNameInZip is null or empty");
11899
}
119-
120-
return fileName;
100+
return fileNameInZip;
121101
}
122102

123103
private AESExtraDataRecord generateAESExtraDataRecord(ZipParameters parameters) throws ZipException {
@@ -163,54 +143,10 @@ private int[] generateGeneralPurposeBitArray(boolean isEncrypted, CompressionMet
163143
return generalPurposeBits;
164144
}
165145

166-
private int getFileAttributes(boolean isSourceExternalStream, File file) {
167-
if (isSourceExternalStream || !file.exists()) {
168-
return 0;
169-
}
170-
171-
if (file.isDirectory()) {
172-
if (file.isHidden()) {
173-
return InternalZipConstants.FOLDER_MODE_HIDDEN;
174-
} else {
175-
return InternalZipConstants.FOLDER_MODE_NONE;
176-
}
177-
} else {
178-
if (!file.canWrite() && file.isHidden()) {
179-
return InternalZipConstants.FILE_MODE_READ_ONLY_HIDDEN;
180-
} else if (!file.canWrite()) {
181-
return InternalZipConstants.FILE_MODE_READ_ONLY;
182-
} else if (file.isHidden()) {
183-
return InternalZipConstants.FILE_MODE_HIDDEN;
184-
} else {
185-
return InternalZipConstants.FILE_MODE_NONE;
186-
}
187-
}
188-
}
189-
190-
private long calculateCompressedSize(ZipParameters zipParameters, long fileSize) {
191-
if (zipParameters.getCompressionMethod() == CompressionMethod.STORE) {
192-
if (zipParameters.getEncryptionMethod() == EncryptionMethod.ZIP_STANDARD) {
193-
return fileSize + InternalZipConstants.STD_DEC_HDR_SIZE;
194-
} else if (zipParameters.getEncryptionMethod() == EncryptionMethod.AES) {
195-
return fileSize + zipParameters.getAesKeyStrength().getSaltLength()
196-
+ InternalZipConstants.AES_AUTH_LENGTH + 2; //2 is password verifier
197-
}
198-
}
199-
return 0;
200-
}
201-
202146
private int determineFileNameLength(String fileName, String fileNameCharset) throws ZipException {
203147
if (Zip4jUtil.isStringNotNullAndNotEmpty(fileNameCharset)) {
204148
return Zip4jUtil.getEncodedStringLength(fileName, fileNameCharset);
205149
}
206150
return Zip4jUtil.getEncodedStringLength(fileName);
207151
}
208-
209-
private boolean isDirectory(String fileName, boolean isSourceExternalStream, File sourceFile) {
210-
if (isSourceExternalStream) {
211-
return fileName.endsWith("/") || fileName.endsWith("\\");
212-
} else {
213-
return sourceFile.isDirectory();
214-
}
215-
}
216152
}

src/main/java/net/lingala/zip4j/headers/HeaderWriter.java

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
package net.lingala.zip4j.headers;
1818

1919
import net.lingala.zip4j.exception.ZipException;
20-
import net.lingala.zip4j.io.SplitOutputStream;
20+
import net.lingala.zip4j.io.outputstreams.CountingOutputStream;
21+
import net.lingala.zip4j.io.outputstreams.SplitOutputStream;
2122
import net.lingala.zip4j.model.AESExtraDataRecord;
2223
import net.lingala.zip4j.model.FileHeader;
2324
import net.lingala.zip4j.model.LocalFileHeader;
@@ -212,8 +213,7 @@ public int writeExtendedLocalHeader(LocalFileHeader localFileHeader,
212213
* @param outputStream
213214
* @throws ZipException
214215
*/
215-
public void finalizeZipFile(ZipModel zipModel,
216-
OutputStream outputStream) throws ZipException {
216+
public void finalizeZipFile(ZipModel zipModel, CountingOutputStream outputStream) throws ZipException {
217217
if (zipModel == null || outputStream == null) {
218218
throw new ZipException("input parameters is null, cannot finalize zip file");
219219
}
@@ -236,9 +236,9 @@ public void finalizeZipFile(ZipModel zipModel,
236236
}
237237

238238
zipModel.getZip64EndOfCentralDirLocator().setOffsetZip64EndOfCentralDirRec(offsetCentralDir + sizeOfCentralDir);
239-
if (outputStream instanceof SplitOutputStream) {
240-
zipModel.getZip64EndOfCentralDirLocator().setNoOfDiskStartOfZip64EndOfCentralDirRec(((SplitOutputStream) outputStream).getCurrSplitFileCounter());
241-
zipModel.getZip64EndOfCentralDirLocator().setTotNumberOfDiscs(((SplitOutputStream) outputStream).getCurrSplitFileCounter() + 1);
239+
if (outputStream.isSplitOutputStream()) {
240+
zipModel.getZip64EndOfCentralDirLocator().setNoOfDiskStartOfZip64EndOfCentralDirRec(outputStream.getCurrentSplitFileCounter());
241+
zipModel.getZip64EndOfCentralDirLocator().setTotNumberOfDiscs(outputStream.getCurrentSplitFileCounter() + 1);
242242
} else {
243243
zipModel.getZip64EndOfCentralDirLocator().setNoOfDiskStartOfZip64EndOfCentralDirRec(0);
244244
zipModel.getZip64EndOfCentralDirLocator().setTotNumberOfDiscs(1);
@@ -319,9 +319,9 @@ private void writeZipHeaderBytes(ZipModel zipModel, OutputStream outputStream, b
319319
}
320320

321321
try {
322-
if (outputStream instanceof SplitOutputStream) {
323-
if (((SplitOutputStream) outputStream).checkBuffSizeAndStartNextSplitFile(buff.length)) {
324-
finalizeZipFile(zipModel, outputStream);
322+
if (outputStream instanceof CountingOutputStream) {
323+
if (((CountingOutputStream) outputStream).checkBuffSizeAndStartNextSplitFile(buff.length)) {
324+
finalizeZipFile(zipModel, (CountingOutputStream)outputStream);
325325
return;
326326
}
327327
}
@@ -342,11 +342,9 @@ private void writeZipHeaderBytes(ZipModel zipModel, OutputStream outputStream, b
342342
private void processHeaderData(ZipModel zipModel, OutputStream outputStream) throws ZipException {
343343
try {
344344
int currSplitFileCounter = 0;
345-
if (outputStream instanceof SplitOutputStream) {
346-
zipModel.getEndOfCentralDirRecord().setOffsetOfStartOfCentralDir(
347-
((SplitOutputStream) outputStream).getFilePointer());
348-
currSplitFileCounter = ((SplitOutputStream) outputStream).getCurrSplitFileCounter();
349-
345+
if (outputStream instanceof CountingOutputStream) {
346+
zipModel.getEndOfCentralDirRecord().setOffsetOfStartOfCentralDir(((CountingOutputStream) outputStream).getFilePointer());
347+
currSplitFileCounter = ((CountingOutputStream) outputStream).getCurrentSplitFileCounter();
350348
}
351349

352350
if (zipModel.isZip64Format()) {
@@ -516,11 +514,11 @@ private int writeFileHeader(ZipModel zipModel, FileHeader fileHeader,
516514
sizeOfFileHeader += 2;
517515

518516
//External file attributes
519-
if (fileHeader.getExternalFileAttr() != null) {
520-
copyByteArrayToArrayList(fileHeader.getExternalFileAttr(), headerBytesList);
521-
} else {
522-
copyByteArrayToArrayList(emptyIntByte, headerBytesList);
523-
}
517+
// if (fileHeader.getExternalFileAttr() != null) {
518+
// copyByteArrayToArrayList(fileHeader.getExternalFileAttr(), headerBytesList);
519+
// } else {
520+
copyByteArrayToArrayList(new byte[] {1, 1, 1, 1}, headerBytesList);
521+
// }
524522
sizeOfFileHeader += 4;
525523

526524
//offset local header

0 commit comments

Comments
 (0)