diff options
author | Remi Collet <remi@php.net> | 2017-03-02 13:36:40 +0100 |
---|---|---|
committer | Remi Collet <remi@php.net> | 2017-03-02 13:36:40 +0100 |
commit | 402eeb85988be91d90a92eff94635b6e9ef6160e (patch) | |
tree | daa4427a300d8560f35dd262e8986acead3d3ccf /ext/zip/php_zip.c | |
parent | 859a6505d3bdb017f68ea1beedb118e3758ccb6f (diff) | |
download | php-git-402eeb85988be91d90a92eff94635b6e9ef6160e.tar.gz |
Zip: add support for encrypted archive
Diffstat (limited to 'ext/zip/php_zip.c')
-rw-r--r-- | ext/zip/php_zip.c | 123 |
1 files changed, 109 insertions, 14 deletions
diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c index 28527cbee1..03f2184399 100644 --- a/ext/zip/php_zip.c +++ b/ext/zip/php_zip.c @@ -379,6 +379,7 @@ static int php_zip_parse_options(zval *options, zend_long *remove_all_path, char /* }}} */ /* {{{ RETURN_SB(sb) */ +#ifdef HAVE_ENCRYPTION #define RETURN_SB(sb) \ { \ array_init(return_value); \ @@ -389,7 +390,21 @@ static int php_zip_parse_options(zval *options, zend_long *remove_all_path, char add_ascii_assoc_long(return_value, "mtime", (zend_long) (sb)->mtime); \ add_ascii_assoc_long(return_value, "comp_size", (zend_long) (sb)->comp_size); \ add_ascii_assoc_long(return_value, "comp_method", (zend_long) (sb)->comp_method); \ + add_ascii_assoc_long(return_value, "encryption_method", (zend_long) (sb)->encryption_method); \ } +#else +#define RETURN_SB(sb) \ + { \ + array_init(return_value); \ + add_ascii_assoc_string(return_value, "name", (char *)(sb)->name); \ + add_ascii_assoc_long(return_value, "index", (zend_long) (sb)->index); \ + add_ascii_assoc_long(return_value, "crc", (zend_long) (sb)->crc); \ + add_ascii_assoc_long(return_value, "size", (zend_long) (sb)->size); \ + add_ascii_assoc_long(return_value, "mtime", (zend_long) (sb)->mtime); \ + add_ascii_assoc_long(return_value, "comp_size", (zend_long) (sb)->comp_size); \ + add_ascii_assoc_long(return_value, "comp_method", (zend_long) (sb)->comp_method); \ + } +#endif /* }}} */ static int php_zip_status(struct zip *za) /* {{{ */ @@ -2222,6 +2237,74 @@ static ZIPARCHIVE_METHOD(getExternalAttributesIndex) /* }}} */ #endif /* ifdef ZIP_OPSYS_DEFAULT */ +#ifdef HAVE_ENCRYPTION +/* {{{ proto bool ZipArchive::setEncryptionName(string name, int method, [string password]) +Set encryption method for file in zip, using its name */ +static ZIPARCHIVE_METHOD(setEncryptionName) +{ + struct zip *intern; + zval *self = getThis(); + zend_long method; + zip_int64_t idx; + char *name, *password = NULL; + size_t name_len, password_len; + + if (!self) { + RETURN_FALSE; + } + + ZIP_FROM_OBJECT(intern, self); + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "sl|s", + &name, &name_len, &method, &password, &password_len) == FAILURE) { + return; + } + + if (name_len < 1) { + php_error_docref(NULL, E_NOTICE, "Empty string as entry name"); + } + + idx = zip_name_locate(intern, name, 0); + if (idx < 0) { + RETURN_FALSE; + } + + if (zip_file_set_encryption(intern, idx, (zip_uint16_t)method, password)) { + RETURN_FALSE; + } + RETURN_TRUE; +} +/* }}} */ + +/* {{{ proto bool ZipArchive::setEncryptionIndex(int index, int method, [string password]) +Set encryption method for file in zip, using its index */ +static ZIPARCHIVE_METHOD(setEncryptionIndex) +{ + struct zip *intern; + zval *self = getThis(); + zend_long index, method; + char *password = NULL; + size_t password_len; + + if (!self) { + RETURN_FALSE; + } + + ZIP_FROM_OBJECT(intern, self); + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "ll|s", + &index, &method, &password, &password_len) == FAILURE) { + return; + } + + if (zip_file_set_encryption(intern, index, (zip_uint16_t)method, password)) { + RETURN_FALSE; + } + RETURN_TRUE; +} +/* }}} */ +#endif + /* {{{ proto string ZipArchive::getCommentName(string name[, int flags]) Returns the comment of an entry using its name */ static ZIPARCHIVE_METHOD(getCommentName) @@ -2952,6 +3035,20 @@ ZEND_END_ARG_INFO() #endif /* ifdef ZIP_OPSYS_DEFAULT */ /* }}} */ +#ifdef HAVE_ENCRYPTION +ZEND_BEGIN_ARG_INFO_EX(arginfo_ziparchive_setencryption_name, 0, 0, 2) + ZEND_ARG_INFO(0, name) + ZEND_ARG_INFO(0, method) + ZEND_ARG_INFO(0, password) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_ziparchive_setencryption_index, 0, 0, 2) + ZEND_ARG_INFO(0, index) + ZEND_ARG_INFO(0, method) + ZEND_ARG_INFO(0, password) +ZEND_END_ARG_INFO() +#endif + ZEND_BEGIN_ARG_INFO_EX(arginfo_ziparchive_setcompname, 0, 0, 2) ZEND_ARG_INFO(0, name) ZEND_ARG_INFO(0, method) @@ -3003,6 +3100,10 @@ static const zend_function_entry zip_class_functions[] = { ZIPARCHIVE_ME(getExternalAttributesIndex, arginfo_ziparchive_getextattrindex, ZEND_ACC_PUBLIC) ZIPARCHIVE_ME(setCompressionName, arginfo_ziparchive_setcompname, ZEND_ACC_PUBLIC) ZIPARCHIVE_ME(setCompressionIndex, arginfo_ziparchive_setcompindex, ZEND_ACC_PUBLIC) +#ifdef HAVE_ENCRYPTION + ZIPARCHIVE_ME(setEncryptionName, arginfo_ziparchive_setencryption_name, ZEND_ACC_PUBLIC) + ZIPARCHIVE_ME(setEncryptionIndex, arginfo_ziparchive_setencryption_index, ZEND_ACC_PUBLIC) +#endif PHP_FE_END }; /* }}} */ @@ -3047,6 +3148,7 @@ static PHP_MINIT_FUNCTION(zip) REGISTER_ZIP_CLASS_CONST_LONG("FL_NODIR", ZIP_FL_NODIR); REGISTER_ZIP_CLASS_CONST_LONG("FL_COMPRESSED", ZIP_FL_COMPRESSED); REGISTER_ZIP_CLASS_CONST_LONG("FL_UNCHANGED", ZIP_FL_UNCHANGED); + #ifdef ZIP_FL_ENC_GUESS /* Default filename encoding policy. */ REGISTER_ZIP_CLASS_CONST_LONG("FL_ENC_GUESS", ZIP_FL_ENC_GUESS); @@ -3064,20 +3166,6 @@ static PHP_MINIT_FUNCTION(zip) REGISTER_ZIP_CLASS_CONST_LONG("FL_ENC_CP437", ZIP_FL_ENC_CP437); #endif -/* XXX The below are rather not implemented or to check whether makes sense to expose. */ -/*#ifdef ZIP_FL_RECOMPRESS - REGISTER_ZIP_CLASS_CONST_LONG("FL_RECOMPRESS", ZIP_FL_RECOMPRESS); -#endif -#ifdef ZIP_FL_ENCRYPTED - REGISTER_ZIP_CLASS_CONST_LONG("FL_ENCRYPTED", ZIP_FL_ENCRYPTED); -#endif -#ifdef ZIP_FL_LOCAL - REGISTER_ZIP_CLASS_CONST_LONG("FL_LOCAL", ZIP_FL_LOCAL); -#endif -#ifdef ZIP_FL_CENTRAL - REGISTER_ZIP_CLASS_CONST_LONG("FL_CENTRAL", ZIP_FL_CENTRAL); -#endif */ - REGISTER_ZIP_CLASS_CONST_LONG("CM_DEFAULT", ZIP_CM_DEFAULT); REGISTER_ZIP_CLASS_CONST_LONG("CM_STORE", ZIP_CM_STORE); REGISTER_ZIP_CLASS_CONST_LONG("CM_SHRINK", ZIP_CM_SHRINK); @@ -3147,6 +3235,13 @@ static PHP_MINIT_FUNCTION(zip) REGISTER_ZIP_CLASS_CONST_LONG("OPSYS_DEFAULT", ZIP_OPSYS_DEFAULT); #endif /* ifdef ZIP_OPSYS_DEFAULT */ +#ifdef HAVE_ENCRYPTION + REGISTER_ZIP_CLASS_CONST_LONG("EM_NONE", ZIP_EM_NONE); + REGISTER_ZIP_CLASS_CONST_LONG("EM_AES_128", ZIP_EM_AES_128); + REGISTER_ZIP_CLASS_CONST_LONG("EM_AES_192", ZIP_EM_AES_192); + REGISTER_ZIP_CLASS_CONST_LONG("EM_AES_256", ZIP_EM_AES_256); +#endif + php_register_url_stream_wrapper("zip", &php_stream_zip_wrapper); le_zip_dir = zend_register_list_destructors_ex(php_zip_free_dir, NULL, le_zip_dir_name, module_number); |