17 Commits

Author SHA1 Message Date
Joshua Hudson
804e9e5a6f Merge pull request #355 from Jnis/patch-2
Unzipping when no space; Stop unzipping when failed;
2017-07-24 16:03:45 -07:00
Joshua Hudson
6eafde0cfb Merge pull request #357 from Coeur/ARC
we do not support MRC
2017-07-24 16:02:52 -07:00
Joshua Hudson
5da2714fb4 Merge pull request #356 from Coeur/compatibility_with_7-zip
Fix compatibility with 7-zip/WinRAR (regression in SSZipArchive 2.0.0)
2017-07-24 16:00:20 -07:00
Antoine Cœur
42c8c9e8c9 Merge branch 'patch-3' into patch-2
* patch-3:
  Added filed to write file error
2017-07-24 20:25:13 +08:00
Antoine Cœur
c8a6eedf78 removed comment 2017-07-24 20:19:49 +08:00
Antoine Cœur
f5b2feed1c we do not support MRC 2017-07-24 20:14:06 +08:00
Antoine Cœur
c84f6e84e2 Fix compatibility with 7-zip/WinRAR (regression in SSZipArchive 2.0.0) 2017-07-24 19:40:49 +08:00
Jnis
a0a649e28b Added filed to write file error 2017-07-24 10:16:54 +04:00
Jnis
0516ff2f90 Unzipping when no space; Stop unzipping when failed; 2017-07-24 10:07:37 +04:00
Antoine Cœur
9562f0a48e Podfile and Acknowledgments 2017-07-20 20:52:11 +08:00
Joshua Hudson
66ab1372d8 Remove warnings from the 2.0 release 2017-07-19 12:33:46 -07:00
Joshua Hudson
b64a644f04 Update README.md 2017-07-17 17:49:44 -07:00
Joshua Hudson
ddd032f71f Update README.md 2017-07-17 17:49:27 -07:00
Joshua Hudson
5bb24be26b Update README.md 2017-07-17 09:07:11 -07:00
Joshua Hudson
6fc5255676 Merge pull request #345 from june20com/master
Added support for overwriting existing symlinks
2017-07-17 09:04:50 -07:00
Joshua Hudson
775a246b2b Update README.md 2017-07-17 08:59:15 -07:00
Paulo Fierro
1ff099811e Added support for overwriting existing symlinks
Also added errors if these operations fail.
2017-06-22 12:57:32 -05:00
12 changed files with 73 additions and 95 deletions

View File

@@ -1,5 +1,5 @@
PODS:
- SSZipArchive (2.0.0)
- SSZipArchive (2.0.2)
DEPENDENCIES:
- SSZipArchive (from `..`)
@@ -9,7 +9,7 @@ EXTERNAL SOURCES:
:path: ".."
SPEC CHECKSUMS:
SSZipArchive: 8153333145bf99acaf1918d257fdcef68a9269e1
SSZipArchive: 5fdf578dbbb60000b23439f80fa04e81d00740ee
PODFILE CHECKSUM: 7f4058a9cbc69b4e63808729577a8bb2098bc527

View File

@@ -14,13 +14,14 @@ ZipArchive is a simple utility class for zipping and unzipping files on iOS and
## Installation and Setup
*The main release branch is configured to support Objective C and Swift 3. There is a 'swift23' branch which is the latest branch but marked to compile for Swift 2.3.*
*The main release branch is configured to support Objective C and Swift 3. There is a 'swift23' branch which is a tied to a older 1.x release and will not be upgraded. Xcode 8.3+ removes support for Swift 2.3*
### CocoaPods
`pod install SSZipArchive`
In your Podfile:
`pod 'SSZipArchive'`
### Carthage
In your Cartfile:
`github "ZipArchive/ZipArchive"`
### Manual
@@ -54,8 +55,11 @@ SSZipArchive.unzipFileAtPath(zipPath, toDestination: unzipPath)
## License
SSZipArchive is protected under the [MIT license](https://github.com/samsoffes/ssziparchive/raw/master/LICENSE) and our slightly modified version of [Minizip](http://www.winimage.com/zLibDll/minizip.html) 1.1 is licensed under the [Zlib license](http://www.zlib.net/zlib_license.html).
SSZipArchive is protected under the [MIT license](https://github.com/samsoffes/ssziparchive/raw/master/LICENSE) and our slightly modified version of [Minizip](https://github.com/nmoinvaz/minizip) 1.1 is licensed under the [Zlib license](http://www.zlib.net/zlib_license.html).
## Acknowledgments
Big thanks to [aish](http://code.google.com/p/ziparchive) for creating [ZipArchive](http://code.google.com/p/ziparchive). The project that inspired SSZipArchive. Thank you [@randomsequence](https://github.com/randomsequence) for implementing the creation support tech and to [@johnezang](https://github.com/johnezang) for all his amazing help along the way.
* Big thanks to [aish](http://code.google.com/p/ziparchive) for creating [ZipArchive](http://code.google.com/p/ziparchive). The project that inspired SSZipArchive.
* Thank you [@soffes](https://github.com/soffes) for the actual name of SSZipArchive.
* Thank you [@randomsequence](https://github.com/randomsequence) for implementing the creation support tech.
* Thank you [@johnezang](https://github.com/johnezang) for all his amazing help along the way.

View File

@@ -1,6 +1,6 @@
Pod::Spec.new do |s|
s.name = 'SSZipArchive'
s.version = '2.0.0'
s.version = '2.0.2'
s.summary = 'Utility class for zipping and unzipping files on iOS, tvOS, watchOS, and Mac.'
s.description = 'SSZipArchive is a simple utility class for zipping and unzipping files on iOS, tvOS, watchOS, and Mac.'
s.homepage = 'https://github.com/ZipArchive/ZipArchive'

View File

@@ -20,6 +20,7 @@ typedef NS_ENUM(NSInteger, SSZipArchiveErrorCode) {
SSZipArchiveErrorCodeFailedOpenFileInZip = -2,
SSZipArchiveErrorCodeFileInfoNotLoadable = -3,
SSZipArchiveErrorCodeFileContentNotReadable = -4,
SSZipArchiveErrorCodeFailedToWriteFile = -5,
};
@protocol SSZipArchiveDelegate;

View File

@@ -383,7 +383,15 @@ NSString *const SSZipArchiveErrorDomain = @"SSZipArchiveErrorDomain";
FILE *fp = fopen((const char*)[fullPath fileSystemRepresentation], "wb");
while (fp) {
if (readBytes > 0) {
fwrite(buffer, readBytes, 1, fp);
if (0 == fwrite(buffer, readBytes, 1, fp)) {
if (ferror(fp)) {
NSString *message = [NSString stringWithFormat:@"Failed to write file (check your free space)"];
NSLog(@"[SSZipArchive] %@", message);
success = NO;
*error = [NSError errorWithDomain:@"SSZipArchiveErrorDomain" code:SSZipArchiveErrorCodeFailedToWriteFile userInfo:@{NSLocalizedDescriptionKey: message}];
break;
}
}
} else {
break;
}
@@ -432,10 +440,6 @@ NSString *const SSZipArchiveErrorDomain = @"SSZipArchiveErrorDomain";
// Unable to set the permissions attribute
NSLog(@"[SSZipArchive] Failed to set attributes - whilst setting permissions");
}
#if !__has_feature(objc_arc)
[attrs release];
#endif
}
}
}
@@ -465,13 +469,34 @@ NSString *const SSZipArchiveErrorDomain = @"SSZipArchiveErrorDomain";
[destinationPath appendString:@((const char*)buffer)];
}
// Check if the symlink exists and delete it if we're overwriting
if (overwrite)
{
if ([fileManager fileExistsAtPath:fullPath])
{
NSError *error = nil;
BOOL success = [fileManager removeItemAtPath:fullPath error:&error];
if (!success)
{
NSString *message = [NSString stringWithFormat:@"Failed to delete existing symbolic link at \"%@\"", error.localizedDescription];
NSLog(@"[SSZipArchive] %@", message);
success = NO;
unzippingError = [NSError errorWithDomain:SSZipArchiveErrorDomain code:error.code userInfo:@{NSLocalizedDescriptionKey: message}];
}
}
}
// Create the symbolic link (making sure it stays relative if it was relative before)
int symlinkError = symlink([destinationPath cStringUsingEncoding:NSUTF8StringEncoding],
[fullPath cStringUsingEncoding:NSUTF8StringEncoding]);
if (symlinkError != 0)
{
NSLog(@"Failed to create symbolic link at \"%@\" to \"%@\". symlink() error code: %d", fullPath, destinationPath, errno);
// Bubble the error up to the completion handler
NSString *message = [NSString stringWithFormat:@"Failed to create symbolic link at \"%@\" to \"%@\" - symlink() error code: %d", fullPath, destinationPath, errno];
NSLog(@"[SSZipArchive] %@", message);
success = NO;
unzippingError = [NSError errorWithDomain:NSPOSIXErrorDomain code:symlinkError userInfo:@{NSLocalizedDescriptionKey: message}];
}
}
@@ -498,7 +523,7 @@ NSString *const SSZipArchiveErrorDomain = @"SSZipArchiveErrorDomain";
progressHandler(strPath, fileInfo, currentFileNumber, globalInfo.number_entry);
}
}
} while (ret == UNZ_OK && ret != UNZ_END_OF_LIST_OF_FILE);
} while (ret == UNZ_OK && YES == success);
// Close
unzClose(zip);
@@ -516,9 +541,6 @@ NSString *const SSZipArchiveErrorDomain = @"SSZipArchiveErrorDomain";
NSLog(@"[SSZipArchive] Error setting directory file modification date attribute: %@",err.localizedDescription);
}
}
#if !__has_feature(objc_arc)
[directoriesModificationDates release];
#endif
}
// Message delegate
@@ -581,11 +603,6 @@ NSString *const SSZipArchiveErrorDomain = @"SSZipArchiveErrorDomain";
}
success = [zipArchive close];
}
#if !__has_feature(objc_arc)
[zipArchive release];
#endif
return success;
}
@@ -645,12 +662,6 @@ NSString *const SSZipArchiveErrorDomain = @"SSZipArchiveErrorDomain";
}
success = [zipArchive close];
}
#if !__has_feature(objc_arc)
[fileManager release];
[zipArchive release];
#endif
return success;
}
@@ -664,15 +675,6 @@ NSString *const SSZipArchiveErrorDomain = @"SSZipArchiveErrorDomain";
}
#if !__has_feature(objc_arc)
- (void)dealloc
{
[_path release];
[super dealloc];
}
#endif
- (BOOL)open
{
NSAssert((_zip == NULL), @"Attempting open an archive which is already open");
@@ -729,7 +731,9 @@ NSString *const SSZipArchiveErrorDomain = @"SSZipArchiveErrorDomain";
uLong permissionsLong = @(permissionsOctal).unsignedLongValue;
// Store this into the external file attributes once it has been shifted 16 places left to form part of the second from last byte
zipInfo.external_fa = permissionsLong << 16L;
//Casted back to an unsigned int to match type of external_fa in minizip
zipInfo.external_fa = (unsigned int)(permissionsLong << 16L);
}
}
@@ -791,7 +795,9 @@ NSString *const SSZipArchiveErrorDomain = @"SSZipArchiveErrorDomain";
uLong permissionsLong = @(permissionsOctal).unsignedLongValue;
// Store this into the external file attributes once it has been shifted 16 places left to form part of the second from last byte
zipInfo.external_fa = permissionsLong << 16L;
//Casted back to an unsigned int to match type of external_fa in minizip
zipInfo.external_fa = (unsigned int)(permissionsLong << 16L);
}
}
@@ -900,11 +906,6 @@ NSString *const SSZipArchiveErrorDomain = @"SSZipArchiveErrorDomain";
[components setSecond:(msdosDateTime & kSecondMask) * 2];
NSDate *date = [NSDate dateWithTimeInterval:0 sinceDate:[gregorian dateFromComponents:components]];
#if !__has_feature(objc_arc)
[components release];
#endif
return date;
}

View File

@@ -129,8 +129,8 @@ int cryptrand(unsigned char *buf, unsigned int len)
return rlen;
}
int crypthead(const char *passwd, uint8_t *buf, int buf_size,
uint32_t *pkeys, const z_crc_t *pcrc_32_tab, uint32_t crc_for_crypting)
int crypthead(const char *passwd, uint8_t *buf, int buf_size, uint32_t *pkeys,
const z_crc_t *pcrc_32_tab, uint8_t verify1, uint8_t verify2)
{
uint8_t n = 0; /* index in random header */
uint8_t header[RAND_HEAD_LEN-2]; /* random header */
@@ -150,8 +150,8 @@ int crypthead(const char *passwd, uint8_t *buf, int buf_size,
for (n = 0; n < RAND_HEAD_LEN-2; n++)
buf[n] = (uint8_t)zencode(pkeys, pcrc_32_tab, header[n], t);
buf[n++] = (uint8_t)zencode(pkeys, pcrc_32_tab, (uint8_t)((crc_for_crypting >> 16) & 0xff), t);
buf[n++] = (uint8_t)zencode(pkeys, pcrc_32_tab, (uint8_t)((crc_for_crypting >> 24) & 0xff), t);
buf[n++] = (uint8_t)zencode(pkeys, pcrc_32_tab, verify1, t);
buf[n++] = (uint8_t)zencode(pkeys, pcrc_32_tab, verify2, t);
return n;
}

View File

@@ -46,7 +46,7 @@ int cryptrand(unsigned char *buf, unsigned int len);
/* Create encryption header */
int crypthead(const char *passwd, uint8_t *buf, int buf_size, uint32_t *pkeys,
const z_crc_t *pcrc_32_tab, uint32_t crc_for_crypting);
const z_crc_t *pcrc_32_tab, uint8_t verify1, uint8_t verify2);
/***************************************************************************/

View File

@@ -238,42 +238,6 @@ int is_large_file(const char *path)
return (pos >= UINT32_MAX);
}
int get_file_crc(const char *path, void *buf, uint32_t size_buf, uint32_t *result_crc)
{
FILE *handle = NULL;
uint32_t calculate_crc = 0;
uint32_t size_read = 0;
int err = 0;
handle = fopen64(path, "rb");
if (handle == NULL)
{
err = -1;
}
else
{
do
{
size_read = (int)fread(buf, 1, size_buf, handle);
if ((size_read < size_buf) && (feof(handle) == 0))
{
printf("error in reading %s\n", path);
err = -1;
}
if (size_read > 0)
calculate_crc = (uint32_t)crc32(calculate_crc, buf, size_read);
}
while ((err == Z_OK) && (size_read > 0));
fclose(handle);
}
printf("file %s crc %x\n", path, calculate_crc);
*result_crc = calculate_crc;
return err;
}
void display_zpos64(uint64_t n, int size_char)
{
/* To avoid compatibility problem we do here the conversion */

View File

@@ -36,9 +36,6 @@ int check_file_exists(const char *path);
/* Check to see if a file is over 4GB and needs ZIP64 extension */
int is_large_file(const char *path);
/* Calculate the CRC32 of a file, because to encrypt a file, we need known the CRC32 of the file before */
int get_file_crc(const char *path, void *buf, uint32_t size_buf, uint32_t *result_crc);
/* Print a 64-bit number for compatibility */
void display_zpos64(uint64_t n, int size_char);

View File

@@ -33,8 +33,8 @@
# define AES_HEADERSIZE (11)
# define AES_KEYSIZE(mode) (64 + (mode * 64))
# include "aes.h"
# include "fileenc.h"
# include "aes/aes.h"
# include "aes/fileenc.h"
#endif
#ifdef HAVE_APPLE_COMPRESSION
# include <compression.h>

View File

@@ -1229,11 +1229,22 @@ extern int ZEXPORT zipOpenNewFileInZip4_64(zipFile file, const char *filename, c
{
unsigned char buf_head[RAND_HEAD_LEN];
uint32_t size_head = 0;
uint8_t verify1 = 0;
uint8_t verify2 = 0;
zi->ci.pcrc_32_tab = get_crc_table();
/*init_keys(password, zi->ci.keys, zi->ci.pcrc_32_tab);*/
size_head = crypthead(password, buf_head, RAND_HEAD_LEN, zi->ci.keys, zi->ci.pcrc_32_tab, (unsigned int)crc_for_crypting);
/*
Info-ZIP modification to ZipCrypto format:
If bit 3 of the general purpose bit flag is set, it uses high byte of 16-bit File Time.
verify1 = (uint8_t)((crc_for_crypting >> 16) & 0xff);
verify2 = (uint8_t)((crc_for_crypting >> 24) & 0xff); */
verify1 = (uint8_t)((zi->ci.dos_date >> 16) & 0xff);
verify2 = (uint8_t)((zi->ci.dos_date >> 8) & 0xff);
size_head = crypthead(password, buf_head, RAND_HEAD_LEN, zi->ci.keys, zi->ci.pcrc_32_tab, verify1, verify2);
zi->ci.total_compressed += size_head;
if (ZWRITE64(zi->z_filefunc, zi->filestream, buf_head, size_head) != size_head)

View File

@@ -1,5 +1,5 @@
PODS:
- SSZipArchive (2.0.0)
- SSZipArchive (2.0.2)
DEPENDENCIES:
- SSZipArchive (from `..`)
@@ -9,7 +9,7 @@ EXTERNAL SOURCES:
:path: ".."
SPEC CHECKSUMS:
SSZipArchive: 8153333145bf99acaf1918d257fdcef68a9269e1
SSZipArchive: 5fdf578dbbb60000b23439f80fa04e81d00740ee
PODFILE CHECKSUM: 0dc500eb72745751ccba7677de4da5534fcef36d