Convert all functions to use objects and drop a resource (#64)

This is a breaking changes but impact should be quite small - only users
that use is_resource will need to update code.
This commit is contained in:
Jakub Zelenka 2026-01-07 19:59:02 +01:00 committed by GitHub
parent 5081dab5fc
commit 9ccd9aadfa
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 111 additions and 105 deletions

View file

@ -2,7 +2,8 @@
List of all features for the release List of all features for the release
## 1.6.0 ## 2.0.0
- Convert all functions to use objects and drop resource
- Removed compatibility with PHP 7.1 and older. - Removed compatibility with PHP 7.1 and older.
## 1.5.4 ## 1.5.4

View file

@ -2,8 +2,9 @@
This document lists backward incompatible change in the extension This document lists backward incompatible change in the extension
## 1.6.0 ## 2.0.0
- minimal PHP version bumped to 7.2 - minimal PHP version bumped to 7.2
- gnupg resource has been removed and the object is used instead in all functions
## 1.5.0 ## 1.5.0
- no backward incompatible changes - no backward incompatible changes

210
gnupg.c
View file

@ -27,8 +27,6 @@
#include "php_gnupg_keylistiterator.h" #include "php_gnupg_keylistiterator.h"
static int le_gnupg;
static zend_class_entry *gnupg_class_entry; static zend_class_entry *gnupg_class_entry;
static zend_object_handlers gnupg_object_handlers; static zend_object_handlers gnupg_object_handlers;
@ -44,7 +42,6 @@ static inline gnupg_object *gnupg_object_from_zobj(zend_object *obj) {
#define GNUPG_GETOBJ() \ #define GNUPG_GETOBJ() \
zval *this = getThis(); \ zval *this = getThis(); \
gnupg_object *intern = NULL; \ gnupg_object *intern = NULL; \
zval *res = NULL; \
do { \ do { \
if (this) { \ if (this) { \
intern = Z_GNUPG_P(this); \ intern = Z_GNUPG_P(this); \
@ -57,9 +54,6 @@ static inline gnupg_object *gnupg_object_from_zobj(zend_object *obj) {
} while (0) } while (0)
/* }}} */ /* }}} */
#define GNUPG_RES_FETCH() \
intern = (gnupg_object *) zend_fetch_resource(Z_RES_P(res), "ctx", le_gnupg)
/* {{{ GNUPG_ERR */ /* {{{ GNUPG_ERR */
#define GNUPG_ERR(error) \ #define GNUPG_ERR(error) \
if (intern) { \ if (intern) { \
@ -177,15 +171,6 @@ static void php_gnupg_make(gnupg_object *intern, zval *options)
} }
/* }}} */ /* }}} */
/* {{{ php_gnupg_res_dtor */
static void php_gnupg_res_dtor(zend_resource *rsrc)
{
gnupg_object *intern = rsrc->ptr;
php_gnupg_free(intern);
efree(intern);
}
/* }}} */
/* {{{ free gnupg object */ /* {{{ free gnupg object */
static void gnupg_object_free(zend_object *object) static void gnupg_object_free(zend_object *object)
{ {
@ -356,9 +341,9 @@ const zend_function_entry gnupg_methods[] = {
}; };
/* }}} */ /* }}} */
/* {{{ arginfo for gnupg function with no parameter */ /* {{{ arginfo for gnupg function with gnupg parameter */
ZEND_BEGIN_ARG_INFO(arginfo_gnupg_void_function, 0) ZEND_BEGIN_ARG_INFO(arginfo_gnupg_void_function, 0)
ZEND_ARG_INFO(0, res) ZEND_ARG_OBJ_INFO(0, gnupg, gnupg, 0)
ZEND_END_ARG_INFO() ZEND_END_ARG_INFO()
/* }}} */ /* }}} */
@ -370,35 +355,35 @@ ZEND_END_ARG_INFO()
/* {{{ arginfo for gnupg function with armor parameter */ /* {{{ arginfo for gnupg function with armor parameter */
ZEND_BEGIN_ARG_INFO(arginfo_gnupg_armor_function, 0) ZEND_BEGIN_ARG_INFO(arginfo_gnupg_armor_function, 0)
ZEND_ARG_INFO(0, res) ZEND_ARG_OBJ_INFO(0, gnupg, gnupg, 0)
ZEND_ARG_INFO(0, armor) ZEND_ARG_INFO(0, armor)
ZEND_END_ARG_INFO() ZEND_END_ARG_INFO()
/* }}} */ /* }}} */
/* {{{ arginfo for gnupg functions with enctext parameter */ /* {{{ arginfo for gnupg functions with enctext parameter */
ZEND_BEGIN_ARG_INFO(arginfo_gnupg_enctext_function, 0) ZEND_BEGIN_ARG_INFO(arginfo_gnupg_enctext_function, 0)
ZEND_ARG_INFO(0, res) ZEND_ARG_OBJ_INFO(0, gnupg, gnupg, 0)
ZEND_ARG_INFO(0, enctext) ZEND_ARG_INFO(0, enctext)
ZEND_END_ARG_INFO() ZEND_END_ARG_INFO()
/* }}} */ /* }}} */
/* {{{ arginfo for gnupg functions with text parameter */ /* {{{ arginfo for gnupg functions with text parameter */
ZEND_BEGIN_ARG_INFO(arginfo_gnupg_text_function, 0) ZEND_BEGIN_ARG_INFO(arginfo_gnupg_text_function, 0)
ZEND_ARG_INFO(0, res) ZEND_ARG_OBJ_INFO(0, gnupg, gnupg, 0)
ZEND_ARG_INFO(0, text) ZEND_ARG_INFO(0, text)
ZEND_END_ARG_INFO() ZEND_END_ARG_INFO()
/* }}} */ /* }}} */
/* {{{ arginfo for gnupg functions with key parameter */ /* {{{ arginfo for gnupg functions with key parameter */
ZEND_BEGIN_ARG_INFO(arginfo_gnupg_key_function, 0) ZEND_BEGIN_ARG_INFO(arginfo_gnupg_key_function, 0)
ZEND_ARG_INFO(0, res) ZEND_ARG_OBJ_INFO(0, gnupg, gnupg, 0)
ZEND_ARG_INFO(0, key) ZEND_ARG_INFO(0, key)
ZEND_END_ARG_INFO() ZEND_END_ARG_INFO()
/* }}} */ /* }}} */
/* {{{ arginfo for gnupg functions with deletekey parameter */ /* {{{ arginfo for gnupg functions with deletekey parameter */
ZEND_BEGIN_ARG_INFO_EX(arginfo_gnupg_deletekey_function, 0, 0, 2) ZEND_BEGIN_ARG_INFO_EX(arginfo_gnupg_deletekey_function, 0, 0, 2)
ZEND_ARG_INFO(0, res) ZEND_ARG_OBJ_INFO(0, gnupg, gnupg, 0)
ZEND_ARG_INFO(0, key) ZEND_ARG_INFO(0, key)
ZEND_ARG_INFO(0, allow_secret) ZEND_ARG_INFO(0, allow_secret)
ZEND_END_ARG_INFO() ZEND_END_ARG_INFO()
@ -406,7 +391,7 @@ ZEND_END_ARG_INFO()
/* {{{ arginfo for gnupg functions with adddecryptkey parameter */ /* {{{ arginfo for gnupg functions with adddecryptkey parameter */
ZEND_BEGIN_ARG_INFO(arginfo_gnupg_key_passphrase_function, 0) ZEND_BEGIN_ARG_INFO(arginfo_gnupg_key_passphrase_function, 0)
ZEND_ARG_INFO(0, res) ZEND_ARG_OBJ_INFO(0, gnupg, gnupg, 0)
ZEND_ARG_INFO(0, key) ZEND_ARG_INFO(0, key)
ZEND_ARG_INFO(0, passphrase) ZEND_ARG_INFO(0, passphrase)
ZEND_END_ARG_INFO() ZEND_END_ARG_INFO()
@ -414,14 +399,14 @@ ZEND_END_ARG_INFO()
/* {{{ arginfo for gnupg functions with keyid parameter */ /* {{{ arginfo for gnupg functions with keyid parameter */
ZEND_BEGIN_ARG_INFO(arginfo_gnupg_keyid_function, 0) ZEND_BEGIN_ARG_INFO(arginfo_gnupg_keyid_function, 0)
ZEND_ARG_INFO(0, res) ZEND_ARG_OBJ_INFO(0, gnupg, gnupg, 0)
ZEND_ARG_INFO(0, keyid) ZEND_ARG_INFO(0, keyid)
ZEND_END_ARG_INFO() ZEND_END_ARG_INFO()
/* }}} */ /* }}} */
/* {{{ arginfo for gnupg_keyinfo function */ /* {{{ arginfo for gnupg_keyinfo function */
ZEND_BEGIN_ARG_INFO_EX(arginfo_gnupg_keyinfo_function, 0, 0, 2) ZEND_BEGIN_ARG_INFO_EX(arginfo_gnupg_keyinfo_function, 0, 0, 2)
ZEND_ARG_INFO(0, res) ZEND_ARG_OBJ_INFO(0, gnupg, gnupg, 0)
ZEND_ARG_INFO(0, pattern) ZEND_ARG_INFO(0, pattern)
ZEND_ARG_INFO(0, secret_only) ZEND_ARG_INFO(0, secret_only)
ZEND_END_ARG_INFO() ZEND_END_ARG_INFO()
@ -429,28 +414,28 @@ ZEND_END_ARG_INFO()
/* {{{ arginfo for gnupg functions with pattern parameter */ /* {{{ arginfo for gnupg functions with pattern parameter */
ZEND_BEGIN_ARG_INFO(arginfo_gnupg_pattern_function, 0) ZEND_BEGIN_ARG_INFO(arginfo_gnupg_pattern_function, 0)
ZEND_ARG_INFO(0, res) ZEND_ARG_OBJ_INFO(0, gnupg, gnupg, 0)
ZEND_ARG_INFO(0, pattern) ZEND_ARG_INFO(0, pattern)
ZEND_END_ARG_INFO() ZEND_END_ARG_INFO()
/* }}} */ /* }}} */
/* {{{ arginfo for gnupg functions with errmode parameter */ /* {{{ arginfo for gnupg functions with errmode parameter */
ZEND_BEGIN_ARG_INFO(arginfo_gnupg_errmode_function, 0) ZEND_BEGIN_ARG_INFO(arginfo_gnupg_errmode_function, 0)
ZEND_ARG_INFO(0, res) ZEND_ARG_OBJ_INFO(0, gnupg, gnupg, 0)
ZEND_ARG_INFO(0, errormode) ZEND_ARG_INFO(0, errormode)
ZEND_END_ARG_INFO() ZEND_END_ARG_INFO()
/* }}} */ /* }}} */
/* {{{ arginfo for gnupg functions with signmode parameter */ /* {{{ arginfo for gnupg functions with signmode parameter */
ZEND_BEGIN_ARG_INFO(arginfo_gnupg_signmode_function, 0) ZEND_BEGIN_ARG_INFO(arginfo_gnupg_signmode_function, 0)
ZEND_ARG_INFO(0, res) ZEND_ARG_OBJ_INFO(0, gnupg, gnupg, 0)
ZEND_ARG_INFO(0, signmode) ZEND_ARG_INFO(0, signmode)
ZEND_END_ARG_INFO() ZEND_END_ARG_INFO()
/* }}} */ /* }}} */
/* {{{ arginfo gnupg_verify_function */ /* {{{ arginfo gnupg_verify_function */
ZEND_BEGIN_ARG_INFO_EX(arginfo_gnupg_verify_function, 0, 0, 3) ZEND_BEGIN_ARG_INFO_EX(arginfo_gnupg_verify_function, 0, 0, 3)
ZEND_ARG_INFO(0, res) ZEND_ARG_OBJ_INFO(0, gnupg, gnupg, 0)
ZEND_ARG_INFO(0, text) ZEND_ARG_INFO(0, text)
ZEND_ARG_INFO(0, signature) ZEND_ARG_INFO(0, signature)
ZEND_ARG_INFO(1, plaintext) ZEND_ARG_INFO(1, plaintext)
@ -459,7 +444,7 @@ ZEND_END_ARG_INFO()
/* {{{ arginfo gnupg_decryptverify_function */ /* {{{ arginfo gnupg_decryptverify_function */
ZEND_BEGIN_ARG_INFO_EX(arginfo_gnupg_decryptverify_function, 0, 0, 3) ZEND_BEGIN_ARG_INFO_EX(arginfo_gnupg_decryptverify_function, 0, 0, 3)
ZEND_ARG_INFO(0, res) ZEND_ARG_OBJ_INFO(0, gnupg, gnupg, 0)
ZEND_ARG_INFO(0, enctext) ZEND_ARG_INFO(0, enctext)
ZEND_ARG_INFO(1, plaintext) ZEND_ARG_INFO(1, plaintext)
ZEND_END_ARG_INFO() ZEND_END_ARG_INFO()
@ -549,9 +534,6 @@ PHP_MINIT_FUNCTION(gnupg)
gnupg_object_handlers.offset = XtOffsetOf(gnupg_object, std); gnupg_object_handlers.offset = XtOffsetOf(gnupg_object, std);
gnupg_object_handlers.free_obj = gnupg_object_free; gnupg_object_handlers.free_obj = gnupg_object_free;
/* register resource */
le_gnupg = zend_register_list_destructors_ex(php_gnupg_res_dtor, NULL, "ctx", module_number);
if (SUCCESS != gnupg_keylistiterator_init(type, module_number)) { if (SUCCESS != gnupg_keylistiterator_init(type, module_number)) {
return FAILURE; return FAILURE;
} }
@ -767,7 +749,7 @@ int gnupg_fetchsignatures(gpgme_signature_t gpgme_signatures, zval *main_arr)
/* }}} */ /* }}} */
/* {{{ proto gnupg::__construct(array options = NULL) /* {{{ proto gnupg::__construct(array options = NULL)
* inits gnupg and returns a resource * construct gnupg object
*/ */
PHP_METHOD(gnupg, __construct) PHP_METHOD(gnupg, __construct)
{ {
@ -783,22 +765,20 @@ PHP_METHOD(gnupg, __construct)
} }
/* }}} */ /* }}} */
/* {{{ proto resource gnupg_init(array options = NULL) /* {{{ proto object gnupg_init(array options = NULL)
* inits gnupg and returns a resource * inits gnupg and returns an object
*/ */
PHP_FUNCTION(gnupg_init) PHP_FUNCTION(gnupg_init)
{ {
zval *options = NULL; zval *options = NULL;
gnupg_object *intern;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|a", &options) == FAILURE) { if (zend_parse_parameters(ZEND_NUM_ARGS(), "|a", &options) == FAILURE) {
return; return;
} }
intern = emalloc(sizeof(gnupg_object)); object_init_ex(return_value, gnupg_class_entry);
php_gnupg_init(intern); gnupg_object *intern = Z_GNUPG_P(return_value);
php_gnupg_make(intern, options); php_gnupg_make(intern, options);
RETURN_RES(zend_register_resource(intern, le_gnupg));
} }
/* }}} */ /* }}} */
@ -809,6 +789,7 @@ PHP_FUNCTION(gnupg_init)
* */ * */
PHP_FUNCTION(gnupg_setarmor) PHP_FUNCTION(gnupg_setarmor)
{ {
zval *object = NULL;
zend_long armor; zend_long armor;
GNUPG_GETOBJ(); GNUPG_GETOBJ();
@ -818,10 +799,10 @@ PHP_FUNCTION(gnupg_setarmor)
return; return;
} }
} else { } else {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl", &res, &armor) == FAILURE) { if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ol", &object, gnupg_class_entry, &armor) == FAILURE) {
return; return;
} }
GNUPG_RES_FETCH(); intern = Z_GNUPG_P(object);
} }
if (armor > 1) { if (armor > 1) {
@ -836,6 +817,7 @@ PHP_FUNCTION(gnupg_setarmor)
/* {{{ proto bool gnupg_seterrormode(int errormode) */ /* {{{ proto bool gnupg_seterrormode(int errormode) */
PHP_FUNCTION(gnupg_seterrormode) PHP_FUNCTION(gnupg_seterrormode)
{ {
zval *object = NULL;
zend_long errormode; zend_long errormode;
GNUPG_GETOBJ(); GNUPG_GETOBJ();
@ -845,10 +827,10 @@ PHP_FUNCTION(gnupg_seterrormode)
return; return;
} }
} else { } else {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl", &res, &errormode) == FAILURE) { if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ol", &object, gnupg_class_entry, &errormode) == FAILURE) {
return; return;
} }
GNUPG_RES_FETCH(); intern = Z_GNUPG_P(object);
} }
switch (errormode) { switch (errormode) {
@ -871,6 +853,7 @@ PHP_FUNCTION(gnupg_seterrormode)
*/ */
PHP_FUNCTION(gnupg_setsignmode) PHP_FUNCTION(gnupg_setsignmode)
{ {
zval *object = NULL;
zend_long signmode; zend_long signmode;
GNUPG_GETOBJ(); GNUPG_GETOBJ();
@ -880,10 +863,10 @@ PHP_FUNCTION(gnupg_setsignmode)
return; return;
} }
} else { } else {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl", &res, &signmode) == FAILURE) { if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ol", &object, gnupg_class_entry, &signmode) == FAILURE) {
return; return;
} }
GNUPG_RES_FETCH(); intern = Z_GNUPG_P(object);
} }
switch (signmode) { switch (signmode) {
case GPGME_SIG_MODE_NORMAL: case GPGME_SIG_MODE_NORMAL:
@ -906,14 +889,15 @@ PHP_FUNCTION(gnupg_setsignmode)
*/ */
PHP_FUNCTION(gnupg_getengineinfo) PHP_FUNCTION(gnupg_getengineinfo)
{ {
zval *object = NULL;
gpgme_engine_info_t info; gpgme_engine_info_t info;
GNUPG_GETOBJ(); GNUPG_GETOBJ();
if (!this) { if (!this) {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &res) == FAILURE) { if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &object, gnupg_class_entry) == FAILURE) {
return; return;
} }
GNUPG_RES_FETCH(); intern = Z_GNUPG_P(object);
} }
info = gpgme_ctx_get_engine_info(intern->ctx); info = gpgme_ctx_get_engine_info(intern->ctx);
@ -930,13 +914,14 @@ PHP_FUNCTION(gnupg_getengineinfo)
*/ */
PHP_FUNCTION(gnupg_geterror) PHP_FUNCTION(gnupg_geterror)
{ {
zval *object = NULL;
GNUPG_GETOBJ(); GNUPG_GETOBJ();
if (!this) { if (!this) {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &res) == FAILURE) { if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &object, gnupg_class_entry) == FAILURE) {
return; return;
} }
GNUPG_RES_FETCH(); intern = Z_GNUPG_P(object);
} }
if (!intern->errortxt) { if (!intern->errortxt) {
RETURN_FALSE; RETURN_FALSE;
@ -951,13 +936,14 @@ PHP_FUNCTION(gnupg_geterror)
*/ */
PHP_FUNCTION(gnupg_geterrorinfo) PHP_FUNCTION(gnupg_geterrorinfo)
{ {
zval *object = NULL;
GNUPG_GETOBJ(); GNUPG_GETOBJ();
if (!this) { if (!this) {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &res) == FAILURE) { if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &object, gnupg_class_entry) == FAILURE) {
return; return;
} }
GNUPG_RES_FETCH(); intern = Z_GNUPG_P(object);
} }
array_init(return_value); array_init(return_value);
@ -987,6 +973,7 @@ PHP_FUNCTION(gnupg_getprotocol) {
*/ */
PHP_FUNCTION(gnupg_keyinfo) PHP_FUNCTION(gnupg_keyinfo)
{ {
zval *object = NULL;
char *searchkey = NULL; char *searchkey = NULL;
size_t searchkey_len; size_t searchkey_len;
zval subarr, userid, userids, subkey, subkeys; zval subarr, userid, userids, subkey, subkeys;
@ -1003,11 +990,11 @@ PHP_FUNCTION(gnupg_keyinfo)
return; return;
} }
} else { } else {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs|b", if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os|b",
&res, &searchkey, &searchkey_len, &secret_only) == FAILURE) { &object, gnupg_class_entry, &searchkey, &searchkey_len, &secret_only) == FAILURE) {
return; return;
} }
GNUPG_RES_FETCH(); intern = Z_GNUPG_P(object);
} }
intern->err = gpgme_op_keylist_start(intern->ctx, searchkey, secret_only); intern->err = gpgme_op_keylist_start(intern->ctx, searchkey, secret_only);
@ -1104,6 +1091,7 @@ PHP_FUNCTION(gnupg_keyinfo)
/* {{{ proto bool gnupg_addsignkey(string key) */ /* {{{ proto bool gnupg_addsignkey(string key) */
PHP_FUNCTION(gnupg_addsignkey) PHP_FUNCTION(gnupg_addsignkey)
{ {
zval *object = NULL;
char *key_id = NULL; char *key_id = NULL;
size_t key_id_len; size_t key_id_len;
char *passphrase = NULL; char *passphrase = NULL;
@ -1119,11 +1107,11 @@ PHP_FUNCTION(gnupg_addsignkey)
return; return;
} }
} else { } else {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs|s", if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os|s",
&res, &key_id, &key_id_len, &passphrase, &passphrase_len) == FAILURE) { &object, gnupg_class_entry, &key_id, &key_id_len, &passphrase, &passphrase_len) == FAILURE) {
return; return;
} }
GNUPG_RES_FETCH(); intern = Z_GNUPG_P(object);
} }
if (!PHP_GNUPG_DO(gpgme_get_key(intern->ctx, key_id, &gpgme_key, 1))) { if (!PHP_GNUPG_DO(gpgme_get_key(intern->ctx, key_id, &gpgme_key, 1))) {
@ -1151,6 +1139,7 @@ PHP_FUNCTION(gnupg_addsignkey)
/* {{{ proto bool gnupg_adddecryptkey(string key) */ /* {{{ proto bool gnupg_adddecryptkey(string key) */
PHP_FUNCTION(gnupg_adddecryptkey) PHP_FUNCTION(gnupg_adddecryptkey)
{ {
zval *object = NULL;
char *key_id = NULL; char *key_id = NULL;
size_t key_id_len; size_t key_id_len;
char *passphrase = NULL; char *passphrase = NULL;
@ -1166,11 +1155,11 @@ PHP_FUNCTION(gnupg_adddecryptkey)
return; return;
} }
} else { } else {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "rss", if (zend_parse_parameters(ZEND_NUM_ARGS(), "Oss",
&res, &key_id, &key_id_len, &passphrase, &passphrase_len) == FAILURE) { &object, gnupg_class_entry, &key_id, &key_id_len, &passphrase, &passphrase_len) == FAILURE) {
return; return;
} }
GNUPG_RES_FETCH(); intern = Z_GNUPG_P(object);
} }
if (!PHP_GNUPG_DO(gpgme_get_key(intern->ctx, key_id, &gpgme_key, 1))) { if (!PHP_GNUPG_DO(gpgme_get_key(intern->ctx, key_id, &gpgme_key, 1))) {
GNUPG_ERR("get_key failed"); GNUPG_ERR("get_key failed");
@ -1191,6 +1180,7 @@ PHP_FUNCTION(gnupg_adddecryptkey)
/* {{{ proto bool gnupg_addencryptkey(string key) */ /* {{{ proto bool gnupg_addencryptkey(string key) */
PHP_FUNCTION(gnupg_addencryptkey) PHP_FUNCTION(gnupg_addencryptkey)
{ {
zval *object = NULL;
char *key_id = NULL; char *key_id = NULL;
size_t key_id_len; size_t key_id_len;
gpgme_key_t gpgme_key = NULL; gpgme_key_t gpgme_key = NULL;
@ -1204,11 +1194,11 @@ PHP_FUNCTION(gnupg_addencryptkey)
return; return;
} }
} else { } else {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os",
&res, &key_id, &key_id_len) == FAILURE) { &object, gnupg_class_entry, &key_id, &key_id_len) == FAILURE) {
return; return;
} }
GNUPG_RES_FETCH(); intern = Z_GNUPG_P(object);
} }
if (!PHP_GNUPG_DO(gpgme_get_key(intern->ctx, key_id, &gpgme_key, 0))) { if (!PHP_GNUPG_DO(gpgme_get_key(intern->ctx, key_id, &gpgme_key, 0))) {
@ -1234,13 +1224,14 @@ PHP_FUNCTION(gnupg_addencryptkey)
*/ */
PHP_FUNCTION(gnupg_clearsignkeys) PHP_FUNCTION(gnupg_clearsignkeys)
{ {
zval *object = NULL;
GNUPG_GETOBJ(); GNUPG_GETOBJ();
if (!this) { if (!this) {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &res) == FAILURE) { if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &object, gnupg_class_entry) == FAILURE) {
return; return;
} }
GNUPG_RES_FETCH(); intern = Z_GNUPG_P(object);
} }
gpgme_signers_clear(intern->ctx); gpgme_signers_clear(intern->ctx);
@ -1254,13 +1245,14 @@ PHP_FUNCTION(gnupg_clearsignkeys)
*/ */
PHP_FUNCTION(gnupg_clearencryptkeys) PHP_FUNCTION(gnupg_clearencryptkeys)
{ {
zval *object = NULL;
GNUPG_GETOBJ(); GNUPG_GETOBJ();
if (!this) { if (!this) {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &res) == FAILURE) { if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &object, gnupg_class_entry) == FAILURE) {
return; return;
} }
GNUPG_RES_FETCH(); intern = Z_GNUPG_P(object);
} }
php_gnupg_free_encryptkeys(intern); php_gnupg_free_encryptkeys(intern);
@ -1273,13 +1265,14 @@ PHP_FUNCTION(gnupg_clearencryptkeys)
*/ */
PHP_FUNCTION(gnupg_cleardecryptkeys) PHP_FUNCTION(gnupg_cleardecryptkeys)
{ {
zval *object = NULL;
GNUPG_GETOBJ(); GNUPG_GETOBJ();
if (!this) { if (!this) {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &res) == FAILURE) { if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &object, gnupg_class_entry) == FAILURE) {
return; return;
} }
GNUPG_RES_FETCH(); intern = Z_GNUPG_P(object);
} }
zend_hash_clean(intern->decryptkeys); zend_hash_clean(intern->decryptkeys);
@ -1294,6 +1287,7 @@ PHP_FUNCTION(gnupg_cleardecryptkeys)
*/ */
PHP_FUNCTION(gnupg_sign) PHP_FUNCTION(gnupg_sign)
{ {
zval *object = NULL;
char *value = NULL; char *value = NULL;
size_t value_len; size_t value_len;
char *userret; char *userret;
@ -1309,11 +1303,11 @@ PHP_FUNCTION(gnupg_sign)
return; return;
} }
} else { } else {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os",
&res, &value, &value_len) == FAILURE) { &object, gnupg_class_entry, &value, &value_len) == FAILURE) {
return; return;
} }
GNUPG_RES_FETCH(); intern = Z_GNUPG_P(object);
} }
gpgme_set_passphrase_cb(intern->ctx, passphrase_cb, intern); gpgme_set_passphrase_cb(intern->ctx, passphrase_cb, intern);
@ -1365,6 +1359,7 @@ PHP_FUNCTION(gnupg_sign)
*/ */
PHP_FUNCTION(gnupg_encrypt) PHP_FUNCTION(gnupg_encrypt)
{ {
zval *object = NULL;
char *value = NULL; char *value = NULL;
size_t value_len; size_t value_len;
char *userret = NULL; char *userret = NULL;
@ -1380,11 +1375,11 @@ PHP_FUNCTION(gnupg_encrypt)
return; return;
} }
} else { } else {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os",
&res, &value, &value_len) == FAILURE) { &object, gnupg_class_entry, &value, &value_len) == FAILURE) {
return; return;
} }
GNUPG_RES_FETCH(); intern = Z_GNUPG_P(object);
} }
if (!intern->encryptkeys) { if (!intern->encryptkeys) {
GNUPG_ERR("no key for encryption set"); GNUPG_ERR("no key for encryption set");
@ -1429,6 +1424,7 @@ PHP_FUNCTION(gnupg_encrypt)
*/ */
PHP_FUNCTION(gnupg_encryptsign) PHP_FUNCTION(gnupg_encryptsign)
{ {
zval *object = NULL;
char *value = NULL; char *value = NULL;
size_t value_len; size_t value_len;
char *userret = NULL; char *userret = NULL;
@ -1445,11 +1441,11 @@ PHP_FUNCTION(gnupg_encryptsign)
return; return;
} }
} else { } else {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os",
&res, &value, &value_len) == FAILURE) { &object, gnupg_class_entry, &value, &value_len) == FAILURE) {
return; return;
} }
GNUPG_RES_FETCH(); intern = Z_GNUPG_P(object);
} }
if (!intern->encryptkeys) { if (!intern->encryptkeys) {
@ -1514,6 +1510,7 @@ PHP_FUNCTION(gnupg_encryptsign)
*/ */
PHP_FUNCTION(gnupg_verify) PHP_FUNCTION(gnupg_verify)
{ {
zval *object = NULL;
gpgme_data_t gpgme_text, gpgme_sig; gpgme_data_t gpgme_text, gpgme_sig;
gpgme_verify_result_t gpgme_result; gpgme_verify_result_t gpgme_result;
/* text without the signature, if its a detached one, or the text incl the sig */ /* text without the signature, if its a detached one, or the text incl the sig */
@ -1533,11 +1530,11 @@ PHP_FUNCTION(gnupg_verify)
return; return;
} }
} else { } else {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "rzz|z", if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ozz|z",
&res, &signed_text, &signature, &plain_text) == FAILURE) { &object, gnupg_class_entry, &signed_text, &signature, &plain_text) == FAILURE) {
return; return;
} }
GNUPG_RES_FETCH(); intern = Z_GNUPG_P(object);
} }
if (Z_TYPE_P(signature) == IS_STRING) { /* detached signature */ if (Z_TYPE_P(signature) == IS_STRING) { /* detached signature */
/* setup signature-databuffer for gpgme */ /* setup signature-databuffer for gpgme */
@ -1606,6 +1603,7 @@ PHP_FUNCTION(gnupg_verify)
*/ */
PHP_FUNCTION(gnupg_decrypt) PHP_FUNCTION(gnupg_decrypt)
{ {
zval *object = NULL;
char *enctxt; char *enctxt;
size_t enctxt_len; size_t enctxt_len;
char *userret; char *userret;
@ -1621,11 +1619,11 @@ PHP_FUNCTION(gnupg_decrypt)
return; return;
} }
} else { } else {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os",
&res, &enctxt, &enctxt_len) == FAILURE) { &object, gnupg_class_entry, &enctxt, &enctxt_len) == FAILURE) {
return; return;
} }
GNUPG_RES_FETCH(); intern = Z_GNUPG_P(object);
} }
gpgme_set_passphrase_cb(intern->ctx, passphrase_decrypt_cb, intern); gpgme_set_passphrase_cb(intern->ctx, passphrase_decrypt_cb, intern);
@ -1671,6 +1669,7 @@ PHP_FUNCTION(gnupg_decrypt)
*/ */
PHP_FUNCTION(gnupg_decryptverify) PHP_FUNCTION(gnupg_decryptverify)
{ {
zval *object = NULL;
char *enctxt; char *enctxt;
size_t enctxt_len; size_t enctxt_len;
zval *plaintext; zval *plaintext;
@ -1688,11 +1687,11 @@ PHP_FUNCTION(gnupg_decryptverify)
return; return;
} }
} else { } else {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "rsz", if (zend_parse_parameters(ZEND_NUM_ARGS(), "Osz",
&res, &enctxt, &enctxt_len, &plaintext) == FAILURE) { &object, gnupg_class_entry, &enctxt, &enctxt_len, &plaintext) == FAILURE) {
return; return;
} }
GNUPG_RES_FETCH(); intern = Z_GNUPG_P(object);
} }
ZVAL_DEREF(plaintext); ZVAL_DEREF(plaintext);
@ -1740,6 +1739,7 @@ PHP_FUNCTION(gnupg_decryptverify)
*/ */
PHP_FUNCTION(gnupg_export) PHP_FUNCTION(gnupg_export)
{ {
zval *object = NULL;
char *searchkey = NULL; char *searchkey = NULL;
size_t searchkey_len; size_t searchkey_len;
char *userret; char *userret;
@ -1754,11 +1754,11 @@ PHP_FUNCTION(gnupg_export)
return; return;
} }
} else { } else {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os",
&res, &searchkey, &searchkey_len) == FAILURE) { &object, gnupg_class_entry, &searchkey, &searchkey_len) == FAILURE) {
return; return;
} }
GNUPG_RES_FETCH(); intern = Z_GNUPG_P(object);
} }
if (!PHP_GNUPG_DO(gpgme_data_new(&out))) { if (!PHP_GNUPG_DO(gpgme_data_new(&out))) {
GNUPG_ERR("could not create data buffer"); GNUPG_ERR("could not create data buffer");
@ -1784,6 +1784,7 @@ PHP_FUNCTION(gnupg_export)
*/ */
PHP_FUNCTION(gnupg_import) PHP_FUNCTION(gnupg_import)
{ {
zval *object = NULL;
char *importkey = NULL; char *importkey = NULL;
size_t importkey_len; size_t importkey_len;
gpgme_data_t in; gpgme_data_t in;
@ -1797,11 +1798,11 @@ PHP_FUNCTION(gnupg_import)
return; return;
} }
} else { } else {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os",
&res, &importkey, &importkey_len) == FAILURE) { &object, gnupg_class_entry, &importkey, &importkey_len) == FAILURE) {
return; return;
} }
GNUPG_RES_FETCH(); intern = Z_GNUPG_P(object);
} }
if (!PHP_GNUPG_DO(gpgme_data_new_from_mem(&in, importkey, importkey_len, 0))) { if (!PHP_GNUPG_DO(gpgme_data_new_from_mem(&in, importkey, importkey_len, 0))) {
GNUPG_ERR("could not create in-data buffer"); GNUPG_ERR("could not create in-data buffer");
@ -1842,6 +1843,7 @@ PHP_FUNCTION(gnupg_import)
*/ */
PHP_FUNCTION(gnupg_deletekey) PHP_FUNCTION(gnupg_deletekey)
{ {
zval *object = NULL;
char *key; char *key;
size_t key_len; size_t key_len;
zend_bool allow_secret = 0; zend_bool allow_secret = 0;
@ -1856,11 +1858,11 @@ PHP_FUNCTION(gnupg_deletekey)
return; return;
} }
} else { } else {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs|b", if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os|b",
&res, &key, &key_len, &allow_secret) == FAILURE) { &object, gnupg_class_entry, &key, &key_len, &allow_secret) == FAILURE) {
return; return;
} }
GNUPG_RES_FETCH(); intern = Z_GNUPG_P(object);
} }
if (!PHP_GNUPG_DO(gpgme_get_key(intern->ctx, key, &gpgme_key, 0))) { if (!PHP_GNUPG_DO(gpgme_get_key(intern->ctx, key, &gpgme_key, 0))) {
@ -1887,6 +1889,7 @@ PHP_FUNCTION(gnupg_deletekey)
*/ */
PHP_FUNCTION(gnupg_gettrustlist) PHP_FUNCTION(gnupg_gettrustlist)
{ {
zval *object = NULL;
char *pattern; char *pattern;
size_t pattern_len; size_t pattern_len;
zval sub_arr; zval sub_arr;
@ -1900,11 +1903,11 @@ PHP_FUNCTION(gnupg_gettrustlist)
return; return;
} }
} else { } else {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os",
&res, &pattern, &pattern_len) == FAILURE) { &object, gnupg_class_entry, &pattern, &pattern_len) == FAILURE) {
return; return;
} }
GNUPG_RES_FETCH(); intern = Z_GNUPG_P(object);
} }
if (!PHP_GNUPG_DO(gpgme_op_trustlist_start(intern->ctx, pattern, 0))) { if (!PHP_GNUPG_DO(gpgme_op_trustlist_start(intern->ctx, pattern, 0))) {
GNUPG_ERR("could not start trustlist"); GNUPG_ERR("could not start trustlist");
@ -1931,6 +1934,7 @@ PHP_FUNCTION(gnupg_gettrustlist)
/* {{{ proto array gnupg_listsignatures(string keyid) */ /* {{{ proto array gnupg_listsignatures(string keyid) */
PHP_FUNCTION(gnupg_listsignatures) PHP_FUNCTION(gnupg_listsignatures)
{ {
zval *object = NULL;
char *keyid; char *keyid;
size_t keyid_len; size_t keyid_len;
@ -1949,11 +1953,11 @@ PHP_FUNCTION(gnupg_listsignatures)
return; return;
} }
} else { } else {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os",
&res, &keyid, &keyid_len) == FAILURE) { &object, gnupg_class_entry, &keyid, &keyid_len) == FAILURE) {
return; return;
} }
GNUPG_RES_FETCH(); intern = Z_GNUPG_P(object);
} }
if (!PHP_GNUPG_DO(gpgme_set_keylist_mode(intern->ctx, GPGME_KEYLIST_MODE_SIGS))) { if (!PHP_GNUPG_DO(gpgme_set_keylist_mode(intern->ctx, GPGME_KEYLIST_MODE_SIGS))) {
GNUPG_ERR("could not switch to sigmode"); GNUPG_ERR("could not switch to sigmode");