diff --git a/README b/README index 0c11e3c..570aba5 100644 --- a/README +++ b/README @@ -11,9 +11,8 @@ This extension requires the gpgme library, which is available at http://www.gnup Notes ----- - -- This extension requires PHP 5. - It was tested with 5.0.5 +- This extension requires at least PHP 4.3.0 + To use this extension in an OOP style, PHP 5 is required - This is a beta version. Donīt use it on production systems. @@ -32,9 +31,6 @@ Notes If a passphrase is required for an operation, this agent is asked first. To avoid this, clear the enviroment-variable GPG_AGENT_INFO (see http://de3.php.net/manual/en/function.putenv.php) -- This extension is class based - No "global" constants are defined. Only class constants - - To specify a custom location of you keyring, simply store the path in the enviroment-variable GNUPGHOME This should make it easy, to use this extension with the apache-user. @@ -67,11 +63,25 @@ Notes Methods ------- +Note: the following explanations are describing the usage of this extension in the OOP style, which is only +available in PHP 5 +To use this extension in a procedural style, simply call "gnupg_init", which returns a resource. +Pass this resource as the first parameter to each function. +In procedural style, all methods gets "gnupg_" prefixed. (setarmor becomes gnupg_setarmor) +Example: + +$res = gnupg_init(); +gnupg_setarmor($res,1); + + - __construct() sets up a new gnupg object ( new gnupg() ) +- resource gnupg_init() + sets up a new gnupg object for procedural use and returns a resource identifier + - bool setarmor(int armor) turn on/off armor mode 0 = off diff --git a/gnupg.c b/gnupg.c index a8cdd14..590be20 100644 --- a/gnupg.c +++ b/gnupg.c @@ -26,36 +26,44 @@ #include "php_ini.h" #include "ext/standard/info.h" #include "php_gnupg.h" + +#ifdef ZEND_ENGINE_2 #include "php_gnupg_keylistiterator.h" +#endif static int le_gnupg; +#ifdef ZEND_ENGINE_2 static zend_object_handlers gnupg_object_handlers; +#endif /* {{{ defs */ -#define GNUGP_GETOBJ() \ +#define GNUPG_GETOBJ() \ zval *this = getThis(); \ gnupg_object *intern; \ - ze_gnupg_object *obj = (ze_gnupg_object*) zend_object_store_get_object(this TSRMLS_CC); \ - intern = obj->gnupg_ptr; \ - if(!intern){ \ - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid or unitialized gnupg object"); \ - RETURN_FALSE; \ - } - -#define GNUPG_ERR(errortxt) \ - zend_update_property_string(Z_OBJCE_P(this), this, "error", 5, (char*)errortxt TSRMLS_DC); \ - RETURN_FALSE; - + if(this){ \ + ze_gnupg_object *obj = (ze_gnupg_object*) zend_object_store_get_object(this TSRMLS_CC); \ + intern = obj->gnupg_ptr; \ + if(!intern){ \ + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid or unitialized gnupg object"); \ + RETURN_FALSE; \ + } \ + } +#define GNUPG_ERR(error) \ + if(intern){ \ + intern->errortxt = (char*)error; \ + }else{ \ + php_error_docref(NULL TSRMLS_CC, E_WARNING, (char*)error); \ + } \ + RETURN_FALSE; /* }}} */ /* {{{ free_resource */ static void gnupg_free_resource_ptr(gnupg_object *intern TSRMLS_DC){ if(intern){ - if(intern->ctx){ - gpgme_signers_clear (intern->ctx); - gpgme_release(intern->ctx); + gpgme_signers_clear (intern->ctx); + gpgme_release (intern->ctx); intern->ctx = NULL; } zval_dtor(&intern->passphrase); @@ -64,6 +72,15 @@ static void gnupg_free_resource_ptr(gnupg_object *intern TSRMLS_DC){ } /* }}} */ +/* {{{ gnupg_res_dtor */ +static void gnupg_res_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) { + gnupg_object *intern; + intern = (gnupg_object *) rsrc->ptr; + gnupg_free_resource_ptr(intern TSRMLS_CC); +} +/* }}} */ + +#ifdef ZEND_ENGINE_2 /* {{{ free_storage */ static void gnupg_object_free_storage(void *object TSRMLS_DC){ ze_gnupg_object * intern = (ze_gnupg_object *) object; @@ -82,6 +99,7 @@ static void gnupg_object_free_storage(void *object TSRMLS_DC){ } /* }}} */ + /* {{{ objects_new */ zend_object_value gnupg_objects_new(zend_class_entry *class_type TSRMLS_DC){ ze_gnupg_object *intern; @@ -137,6 +155,28 @@ static zend_function_entry gnupg_methods[] = { ZEND_ME(gnupg, decryptverify, NULL, ZEND_ACC_PUBLIC) {NULL, NULL, NULL} }; +#endif /* ZEND_ENGINE_2 */ +static zend_function_entry gnupg_functions[] = { + PHP_FE(gnupg_init, NULL) + PHP_FE(gnupg_keyinfo, NULL) + PHP_FE(gnupg_setsignerkey, NULL) + PHP_FE(gnupg_setpassphrase, NULL) + PHP_FE(gnupg_sign, NULL) + PHP_FE(gnupg_verify, NULL) + PHP_FE(gnupg_clearsignerkey, NULL) + PHP_FE(gnupg_setencryptkey, NULL) + PHP_FE(gnupg_setarmor, NULL) + PHP_FE(gnupg_encrypt, NULL) + PHP_FE(gnupg_decrypt, NULL) + PHP_FE(gnupg_export, NULL) + PHP_FE(gnupg_import, NULL) + PHP_FE(gnupg_getprotocol, NULL) + PHP_FE(gnupg_setsignmode, NULL) + PHP_FE(gnupg_encryptsign, NULL) + PHP_FE(gnupg_decryptverify, NULL) + PHP_FE(gnupg_geterror, NULL) + {NULL, NULL, NULL} +}; /* }}} */ /* {{{ class constants */ @@ -154,10 +194,14 @@ static void gnupg_declare_long_constant(const char *const_name, long value TSRML /* }}} */ /* {{{ properties */ +/* void register_gnupgProperties(TSRMLS_D){ + #ifdef ZEND_ENGINE_2 zend_declare_property_long (gnupg_class_entry, "protocol", 8, GPGME_PROTOCOL_OpenPGP, ZEND_ACC_PROTECTED TSRMLS_DC); zend_declare_property_string (gnupg_class_entry, "error", 5, "", ZEND_ACC_PROTECTED TSRMLS_DC); + #endif } +*/ /* }}} */ /* {{{ gnupg_module_entry @@ -167,14 +211,14 @@ zend_module_entry gnupg_module_entry = { STANDARD_MODULE_HEADER, #endif "gnupg", - NULL, + gnupg_functions, PHP_MINIT(gnupg), PHP_MSHUTDOWN(gnupg), NULL, NULL, PHP_MINFO(gnupg), #if ZEND_MODULE_API_NO >= 20010901 - "0.2", + "0.4", #endif STANDARD_MODULE_PROPERTIES }; @@ -188,42 +232,64 @@ ZEND_GET_MODULE(gnupg) */ PHP_MINIT_FUNCTION(gnupg) { - zend_class_entry ce; - - INIT_CLASS_ENTRY(ce, "gnupg", gnupg_methods); - - ce.create_object = gnupg_objects_new; - gnupg_class_entry = zend_register_internal_class(&ce TSRMLS_CC); - memcpy(&gnupg_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); - le_gnupg = zend_register_list_destructors_ex(NULL, NULL, "ctx", module_number); + le_gnupg = zend_register_list_destructors_ex(gnupg_res_dtor, NULL, "ctx", module_number); +#ifdef ZEND_ENGINE_2 + zend_class_entry ce; + + INIT_CLASS_ENTRY(ce, "gnupg", gnupg_methods); + + ce.create_object = gnupg_objects_new; + gnupg_class_entry = zend_register_internal_class(&ce TSRMLS_CC); + memcpy(&gnupg_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); if (SUCCESS != gnupg_keylistiterator_init()){ return FAILURE; } - - register_gnupgProperties(TSRMLS_CC); - gnupg_declare_long_constant("SIG_MODE_NORMAL", GPGME_SIG_MODE_NORMAL TSRMLS_DC); - gnupg_declare_long_constant("SIG_MODE_DETACH", GPGME_SIG_MODE_DETACH TSRMLS_DC); - gnupg_declare_long_constant("SIG_MODE_CLEAR", GPGME_SIG_MODE_CLEAR TSRMLS_DC); - gnupg_declare_long_constant("VALIDITY_UNKNOWN", GPGME_VALIDITY_UNKNOWN TSRMLS_DC); - gnupg_declare_long_constant("VALIDITY_UNDEFINED", GPGME_VALIDITY_UNDEFINED TSRMLS_DC); - gnupg_declare_long_constant("VALIDITY_NEVER", GPGME_VALIDITY_NEVER TSRMLS_DC); - gnupg_declare_long_constant("VALIDITY_MARGINAL", GPGME_VALIDITY_MARGINAL TSRMLS_DC); - gnupg_declare_long_constant("VALIDITY_FULL", GPGME_VALIDITY_FULL TSRMLS_DC); - gnupg_declare_long_constant("VALIDITY_ULTIMATE", GPGME_VALIDITY_ULTIMATE TSRMLS_DC); - gnupg_declare_long_constant("PROTOCOL_OpenPGP", GPGME_PROTOCOL_OpenPGP TSRMLS_DC); - gnupg_declare_long_constant("PROTOCOL_CMS", GPGME_PROTOCOL_CMS TSRMLS_DC); - gnupg_declare_long_constant("SIGSUM_VALID", GPGME_SIGSUM_VALID TSRMLS_DC); - gnupg_declare_long_constant("SIGSUM_GREEN", GPGME_SIGSUM_GREEN TSRMLS_DC); - gnupg_declare_long_constant("SIGSUM_RED", GPGME_SIGSUM_RED TSRMLS_DC); - gnupg_declare_long_constant("SIGSUM_KEY_REVOKED", GPGME_SIGSUM_KEY_REVOKED TSRMLS_DC); - gnupg_declare_long_constant("SIGSUM_KEY_EXPIRED", GPGME_SIGSUM_KEY_EXPIRED TSRMLS_DC); - gnupg_declare_long_constant("SIGSUM_SIG_EXPIRED", GPGME_SIGSUM_SIG_EXPIRED TSRMLS_DC); - gnupg_declare_long_constant("SIGSUM_KEY_MISSING", GPGME_SIGSUM_KEY_MISSING TSRMLS_DC); - gnupg_declare_long_constant("SIGSUM_CRL_MISSING", GPGME_SIGSUM_CRL_MISSING TSRMLS_DC); - gnupg_declare_long_constant("SIGSUM_CRL_TOO_OLD", GPGME_SIGSUM_CRL_TOO_OLD TSRMLS_DC); - gnupg_declare_long_constant("SIGSUM_BAD_POLICY", GPGME_SIGSUM_BAD_POLICY TSRMLS_DC); - gnupg_declare_long_constant("SIGSUM_SYS_ERROR", GPGME_SIGSUM_SYS_ERROR TSRMLS_DC); + gnupg_declare_long_constant("SIG_MODE_NORMAL", GPGME_SIG_MODE_NORMAL TSRMLS_DC); + gnupg_declare_long_constant("SIG_MODE_DETACH", GPGME_SIG_MODE_DETACH TSRMLS_DC); + gnupg_declare_long_constant("SIG_MODE_CLEAR", GPGME_SIG_MODE_CLEAR TSRMLS_DC); + gnupg_declare_long_constant("VALIDITY_UNKNOWN", GPGME_VALIDITY_UNKNOWN TSRMLS_DC); + gnupg_declare_long_constant("VALIDITY_UNDEFINED", GPGME_VALIDITY_UNDEFINED TSRMLS_DC); + gnupg_declare_long_constant("VALIDITY_NEVER", GPGME_VALIDITY_NEVER TSRMLS_DC); + gnupg_declare_long_constant("VALIDITY_MARGINAL", GPGME_VALIDITY_MARGINAL TSRMLS_DC); + gnupg_declare_long_constant("VALIDITY_FULL", GPGME_VALIDITY_FULL TSRMLS_DC); + gnupg_declare_long_constant("VALIDITY_ULTIMATE", GPGME_VALIDITY_ULTIMATE TSRMLS_DC); + gnupg_declare_long_constant("PROTOCOL_OpenPGP", GPGME_PROTOCOL_OpenPGP TSRMLS_DC); + gnupg_declare_long_constant("PROTOCOL_CMS", GPGME_PROTOCOL_CMS TSRMLS_DC); + gnupg_declare_long_constant("SIGSUM_VALID", GPGME_SIGSUM_VALID TSRMLS_DC); + gnupg_declare_long_constant("SIGSUM_GREEN", GPGME_SIGSUM_GREEN TSRMLS_DC); + gnupg_declare_long_constant("SIGSUM_RED", GPGME_SIGSUM_RED TSRMLS_DC); + gnupg_declare_long_constant("SIGSUM_KEY_REVOKED", GPGME_SIGSUM_KEY_REVOKED TSRMLS_DC); + gnupg_declare_long_constant("SIGSUM_KEY_EXPIRED", GPGME_SIGSUM_KEY_EXPIRED TSRMLS_DC); + gnupg_declare_long_constant("SIGSUM_SIG_EXPIRED", GPGME_SIGSUM_SIG_EXPIRED TSRMLS_DC); + gnupg_declare_long_constant("SIGSUM_KEY_MISSING", GPGME_SIGSUM_KEY_MISSING TSRMLS_DC); + gnupg_declare_long_constant("SIGSUM_CRL_MISSING", GPGME_SIGSUM_CRL_MISSING TSRMLS_DC); + gnupg_declare_long_constant("SIGSUM_CRL_TOO_OLD", GPGME_SIGSUM_CRL_TOO_OLD TSRMLS_DC); + gnupg_declare_long_constant("SIGSUM_BAD_POLICY", GPGME_SIGSUM_BAD_POLICY TSRMLS_DC); + gnupg_declare_long_constant("SIGSUM_SYS_ERROR", GPGME_SIGSUM_SYS_ERROR TSRMLS_DC); +#endif + REGISTER_LONG_CONSTANT("GNUPG_SIG_MODE_NORMAL", GPGME_SIG_MODE_NORMAL, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("GNUPG_SIG_MODE_DETACH", GPGME_SIG_MODE_DETACH, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("GNUPG_SIG_MODE_CLEAR", GPGME_SIG_MODE_CLEAR, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("GNUPG_VALIDITY_UNKNOWN", GPGME_VALIDITY_UNKNOWN, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("GNUPG_VALIDITY_UNDEFINED", GPGME_VALIDITY_UNDEFINED, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("GNUPG_VALIDITY_NEVER", GPGME_VALIDITY_NEVER, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("GNUPG_VALIDITY_MARGINAL", GPGME_VALIDITY_MARGINAL, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("GNUPG_VALIDITY_FULL", GPGME_VALIDITY_FULL, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("GNUPG_VALIDITY_ULTIMATE", GPGME_VALIDITY_ULTIMATE, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("GNUPG_PROTOCOL_OpenPGP", GPGME_PROTOCOL_OpenPGP, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("GNUPG_PROTOCOL_CMS", GPGME_PROTOCOL_CMS, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("GNUPG_SIGSUM_VALID", GPGME_SIGSUM_VALID, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("GNUPG_SIGSUM_GREEN", GPGME_SIGSUM_GREEN, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("GNUPG_SIGSUM_RED", GPGME_SIGSUM_RED, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("GNUPG_SIGSUM_KEY_REVOKED", GPGME_SIGSUM_KEY_REVOKED, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("GNUPG_SIGSUM_KEY_EXPIRED", GPGME_SIGSUM_KEY_EXPIRED, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("GNUPG_SIGSUM_SIG_EXPIRED", GPGME_SIGSUM_SIG_EXPIRED, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("GNUPG_SIGSUM_KEY_MISSING", GPGME_SIGSUM_KEY_MISSING, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("GNUPG_SIGSUM_CRL_MISSING", GPGME_SIGSUM_CRL_MISSING, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("GNUPG_SIGSUM_CRL_TOO_OLD", GPGME_SIGSUM_CRL_TOO_OLD, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("GNUPG_SIGSUM_BAD_POLICY", GPGME_SIGSUM_BAD_POLICY, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("GNUPG_SIGSUM_SYS_ERROR", GPGME_SIGSUM_SYS_ERROR, CONST_CS | CONST_PERSISTENT); return SUCCESS; } /* }}} */ @@ -265,19 +331,43 @@ gpgme_error_t passphrase_cb (gnupg_object *intern, const char *uid_hint, const c } /* }}} */ + +/* {{{ proto resource gnupg_init() + * inits gnupg and returns a resource +*/ +PHP_FUNCTION(gnupg_init){ + gnupg_object *intern; + + intern = emalloc(sizeof(gnupg_object)); + gpgme_new (&intern->ctx); + intern->signmode = GPGME_SIG_MODE_CLEAR; + intern->encryptkey = NULL; + gpgme_set_armor (intern->ctx,1); + ZEND_REGISTER_RESOURCE(return_value,intern,le_gnupg); +} +/* }}} */ + /* {{{ proto bool gnupg_setarmor(int armor) * turn on/off armor mode * 0 = off * >0 = on * */ PHP_FUNCTION(gnupg_setarmor){ - int armor; + int armor; + zval *res; - GNUGP_GETOBJ(); - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &armor) == FAILURE){ - return; - } + GNUPG_GETOBJ(); + + if(this){ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &armor) == FAILURE){ + return; + } + }else{ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &res, &armor) == FAILURE){ + return; + } + ZEND_FETCH_RESOURCE(intern,gnupg_object *, &res, -1, "ctx", le_gnupg); + } if(armor > 1){ armor = 1; /*just to make sure */ @@ -293,12 +383,20 @@ PHP_FUNCTION(gnupg_setarmor){ */ PHP_FUNCTION(gnupg_setsignmode){ int signmode; + zval *res; - GNUGP_GETOBJ(); + GNUPG_GETOBJ(); - if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,"l", &signmode) == FAILURE){ - return; - } + if(this){ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &signmode) == FAILURE){ + return; + } + }else{ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &res, &signmode) == FAILURE){ + return; + } + ZEND_FETCH_RESOURCE(intern,gnupg_object *, &res, -1, "ctx", le_gnupg); + } switch(signmode){ case GPGME_SIG_MODE_NORMAL: case GPGME_SIG_MODE_DETACH: @@ -318,12 +416,21 @@ PHP_FUNCTION(gnupg_setsignmode){ */ PHP_FUNCTION(gnupg_setpassphrase){ zval *tmp; + zval *res; - GNUGP_GETOBJ(); + GNUPG_GETOBJ(); + + if(this){ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &tmp) == FAILURE){ + return; + } + }else{ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rz", &res, &tmp) == FAILURE){ + return; + } + ZEND_FETCH_RESOURCE(intern,gnupg_object *, &res, -1, "ctx", le_gnupg); + } - if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,"z", &tmp) == FAILURE){ - return; - } intern->passphrase = *tmp; zval_copy_ctor(&intern->passphrase); RETURN_TRUE; @@ -334,11 +441,21 @@ PHP_FUNCTION(gnupg_setpassphrase){ * returns the last errormessage */ PHP_FUNCTION(gnupg_geterror){ - zval *error; - zval *this = getThis(); + zval *res; + + GNUPG_GETOBJ(); - error = zend_read_property(Z_OBJCE_P(this), this, "error", 5, 1 TSRMLS_CC); - RETURN_STRINGL(Z_STRVAL_P(error), Z_STRLEN_P(error), 1); + if(!this){ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &res) == FAILURE){ + return; + } + ZEND_FETCH_RESOURCE(intern,gnupg_object *, &res, -1, "ctx", le_gnupg); + } + if(!intern->errortxt){ + RETURN_FALSE; + }else{ + RETURN_STRINGL(intern->errortxt, strlen(intern->errortxt), 1); + } } /* }}} */ @@ -347,10 +464,7 @@ PHP_FUNCTION(gnupg_geterror){ * atm only OpenPGP is supported */ PHP_FUNCTION(gnupg_getprotocol){ - zval *protocol; - GNUGP_GETOBJ(); - protocol = zend_read_property(Z_OBJCE_P(this), this, "protocol", 8, 1 TSRMLS_CC); - RETURN_LONG(Z_LVAL_P(protocol)); + RETURN_LONG(GPGME_PROTOCOL_OpenPGP); } /* }}} */ @@ -368,17 +482,24 @@ PHP_FUNCTION(gnupg_keyinfo) zval *userids; zval *subkey; zval *subkeys; + zval *res; gpgme_key_t gpgkey; gpgme_subkey_t gpgsubkey; gpgme_user_id_t gpguserid; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &searchkey, &searchkey_len) == FAILURE){ - return; - } - GNUGP_GETOBJ() - + GNUPG_GETOBJ(); + + if(this){ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &searchkey, &searchkey_len) == FAILURE){ + return; + } + }else{ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &res, &searchkey, &searchkey_len) == FAILURE){ + return; + } + ZEND_FETCH_RESOURCE(intern,gnupg_object *, &res, -1, "ctx", le_gnupg); + } if((intern->err = gpgme_op_keylist_start(intern->ctx, searchkey, 0)) != GPG_ERR_NO_ERROR){ GNUPG_ERR("could not init keylist"); } @@ -458,14 +579,22 @@ PHP_FUNCTION(gnupg_keyinfo) PHP_FUNCTION(gnupg_setsignerkey){ char *key_id = NULL; int key_id_len; + zval *res; gpgme_sign_result_t result; gpgme_key_t gpgme_key; - GNUGP_GETOBJ(); + GNUPG_GETOBJ(); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &key_id, &key_id_len) == FAILURE){ - return; + if(this){ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &key_id, &key_id_len) == FAILURE){ + return; + } + }else{ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &res, &key_id, &key_id_len) == FAILURE){ + return; + } + ZEND_FETCH_RESOURCE(intern,gnupg_object *, &res, -1, "ctx", le_gnupg); } if((intern->err = gpgme_get_key(intern->ctx, key_id, &gpgme_key, 1)) != GPG_ERR_NO_ERROR){ GNUPG_ERR("get_key failed"); @@ -488,15 +617,24 @@ PHP_FUNCTION(gnupg_setsignerkey){ PHP_FUNCTION(gnupg_setencryptkey){ char *key_id = NULL; int key_id_len; + zval *res; gpgme_sign_result_t result; gpgme_key_t gpgme_key; - GNUGP_GETOBJ(); + GNUPG_GETOBJ(); + + if(this){ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &key_id, &key_id_len) == FAILURE){ + return; + } + }else{ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &res, &key_id, &key_id_len) == FAILURE){ + return; + } + ZEND_FETCH_RESOURCE(intern,gnupg_object *, &res, -1, "ctx", le_gnupg); + } - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &key_id, &key_id_len) == FAILURE){ - return; - } if((intern->err = gpgme_get_key(intern->ctx, key_id, &gpgme_key, 0)) != GPG_ERR_NO_ERROR){ GNUPG_ERR("get_key failed"); } @@ -512,9 +650,17 @@ PHP_FUNCTION(gnupg_setencryptkey){ * removes all keys which are set for signing */ PHP_FUNCTION(gnupg_clearsignerkey){ + zval *res; + + GNUPG_GETOBJ(); + + if(!this){ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &res) == FAILURE){ + return; + } + ZEND_FETCH_RESOURCE(intern,gnupg_object *, &res, -1, "ctx", le_gnupg); + } - GNUGP_GETOBJ(); - gpgme_signers_clear (intern->ctx); RETURN_TRUE; } @@ -524,8 +670,16 @@ PHP_FUNCTION(gnupg_clearsignerkey){ * removes all keys which are set for encryption */ PHP_FUNCTION(gnupg_clearencryptkey){ + zval *res; - GNUGP_GETOBJ(); + GNUPG_GETOBJ(); + + if(!this){ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &res) == FAILURE){ + return; + } + ZEND_FETCH_RESOURCE(intern,gnupg_object *, &res, -1, "ctx", le_gnupg); + } gpgme_key_release (intern->encryptkey); @@ -545,14 +699,24 @@ PHP_FUNCTION(gnupg_sign){ char *userret; int ret_size; + zval *res; + gpgme_data_t in, out; gpgme_sign_result_t result; - GNUGP_GETOBJ(); + GNUPG_GETOBJ(); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &value, &value_len) == FAILURE){ - return; + if(this){ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &value, &value_len) == FAILURE){ + return; + } + }else{ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &res, &value, &value_len) == FAILURE){ + return; + } + ZEND_FETCH_RESOURCE(intern,gnupg_object *, &res, -1, "ctx", le_gnupg); } + gpgme_set_passphrase_cb (intern->ctx, (void*) passphrase_cb, intern); if((intern->err = gpgme_data_new_from_mem (&in, value, value_len, 0))!=GPG_ERR_NO_ERROR){ GNUPG_ERR("could not create in-data buffer"); @@ -593,19 +757,25 @@ PHP_FUNCTION(gnupg_encrypt){ int value_len; char *userret = NULL; int ret_size; + zval *res; gpgme_data_t in, out; gpgme_encrypt_result_t result; - GNUGP_GETOBJ(); - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &value, &value_len) == FAILURE){ - return; - } + GNUPG_GETOBJ(); + if(this){ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &value, &value_len) == FAILURE){ + return; + } + }else{ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &res, &value, &value_len) == FAILURE){ + return; + } + ZEND_FETCH_RESOURCE(intern,gnupg_object *, &res, -1, "ctx", le_gnupg); + } if(!intern->encryptkey){ - zend_update_property_string(Z_OBJCE_P(this), this, "error", 5, "no key for encryption set" TSRMLS_DC); - RETURN_FALSE; + GNUPG_ERR("no key for encryption set"); } if((intern->err = gpgme_data_new_from_mem (&in, value, value_len, 0))!=GPG_ERR_NO_ERROR){ GNUPG_ERR("could no create in-data buffer"); @@ -639,19 +809,27 @@ PHP_FUNCTION(gnupg_encryptsign){ int value_len; char *userret = NULL; int ret_size; + zval *res; + gpgme_data_t in, out; gpgme_encrypt_result_t result; gpgme_sign_result_t sign_result; - GNUGP_GETOBJ(); + GNUPG_GETOBJ(); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &value, &value_len) == FAILURE){ - return; + if(this){ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &value, &value_len) == FAILURE){ + return; + } + }else{ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &res, &value, &value_len) == FAILURE){ + return; + } + ZEND_FETCH_RESOURCE(intern,gnupg_object *, &res, -1, "ctx", le_gnupg); } if(!intern->encryptkey){ - zend_update_property_string(Z_OBJCE_P(this), this, "error", 5, "no key for encryption set" TSRMLS_DC); - RETURN_FALSE; + GNUPG_ERR("no key for encryption set"); } gpgme_set_passphrase_cb (intern->ctx, (void*) passphrase_cb, intern); if((intern->err = gpgme_data_new_from_mem (&in, value, value_len, 0))!=GPG_ERR_NO_ERROR){ @@ -696,6 +874,7 @@ PHP_FUNCTION(gnupg_verify){ int value_len; int tmp; zval *plaintext; + zval *res; char *userret; int ret_size; @@ -703,11 +882,19 @@ PHP_FUNCTION(gnupg_verify){ gpgme_data_t in, out; gpgme_verify_result_t result; - GNUGP_GETOBJ(); + GNUPG_GETOBJ(); + + if(this){ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|z", &value, &value_len, &plaintext) == FAILURE){ + return; + } + }else{ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs|z", &res, &value, &value_len, &plaintext) == FAILURE){ + return; + } + ZEND_FETCH_RESOURCE(intern,gnupg_object *, &res, -1, "ctx", le_gnupg); + } - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|z", &value, &value_len, &plaintext) == FAILURE){ - return; - } if((intern->err = gpgme_data_new_from_mem (&in, value, value_len, 0))!=GPG_ERR_NO_ERROR){ GNUPG_ERR("could not create in-data buffer"); } @@ -750,15 +937,24 @@ PHP_FUNCTION(gnupg_decrypt){ char *userret; int ret_size; + + zval *res; gpgme_data_t in, out; gpgme_decrypt_result_t result; - GNUGP_GETOBJ(); + GNUPG_GETOBJ(); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &enctxt, &enctxt_len) == FAILURE){ - return; - } + if(this){ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &enctxt, &enctxt_len) == FAILURE){ + return; + } + }else{ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &res, &enctxt, &enctxt_len) == FAILURE){ + return; + } + ZEND_FETCH_RESOURCE(intern,gnupg_object *, &res, -1, "ctx", le_gnupg); + } gpgme_set_passphrase_cb (intern->ctx, (void*) passphrase_cb, intern); @@ -796,14 +992,23 @@ PHP_FUNCTION(gnupg_decryptverify){ char *userret; int ret_size; + zval *res; + gpgme_data_t in, out; gpgme_decrypt_result_t decrypt_result; gpgme_verify_result_t verify_result; - GNUGP_GETOBJ(); + GNUPG_GETOBJ(); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz", &enctxt, &enctxt_len, &plaintext) == FAILURE){ - return; + if(this){ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz", &enctxt, &enctxt_len, &plaintext) == FAILURE){ + return; + } + }else{ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsz", &res, &enctxt, &enctxt_len, &plaintext) == FAILURE){ + return; + } + ZEND_FETCH_RESOURCE(intern,gnupg_object *, &res, -1, "ctx", le_gnupg); } gpgme_set_passphrase_cb (intern->ctx, (void*) passphrase_cb, intern); @@ -852,13 +1057,22 @@ PHP_FUNCTION(gnupg_export){ char *userret; int ret_size; + zval *res; + gpgme_data_t out; - GNUGP_GETOBJ(); + GNUPG_GETOBJ(); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &searchkey, &searchkey_len) == FAILURE){ - return; - } + if(this){ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &searchkey, &searchkey_len) == FAILURE){ + return; + } + }else{ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &res, &searchkey, &searchkey_len) == FAILURE){ + return; + } + ZEND_FETCH_RESOURCE(intern,gnupg_object *, &res, -1, "ctx", le_gnupg); + } if((intern->err = gpgme_data_new (&out))!=GPG_ERR_NO_ERROR){ GNUPG_ERR("could not create data buffer"); } @@ -880,14 +1094,23 @@ PHP_FUNCTION(gnupg_export){ PHP_FUNCTION(gnupg_import){ char *importkey = NULL; int importkey_len; + zval *res; + gpgme_data_t in; gpgme_import_result_t result; - GNUGP_GETOBJ(); + GNUPG_GETOBJ(); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &importkey, &importkey_len) == FAILURE){ - return; - } + if(this){ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &importkey, &importkey_len) == FAILURE){ + return; + } + }else{ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &res, &importkey, &importkey_len) == FAILURE){ + return; + } + ZEND_FETCH_RESOURCE(intern,gnupg_object *, &res, -1, "ctx", le_gnupg); + } if((intern->err = gpgme_data_new_from_mem (&in, importkey, importkey_len, 0))!=GPG_ERR_NO_ERROR){ GNUPG_ERR("could not create in-data buffer"); } diff --git a/gnupg_keylistiterator.c b/gnupg_keylistiterator.c index 5392261..47b4fdc 100644 --- a/gnupg_keylistiterator.c +++ b/gnupg_keylistiterator.c @@ -23,6 +23,9 @@ #endif #include "php.h" + +#ifdef ZEND_ENGINE_2 + #include "php_ini.h" #include "ext/standard/info.h" #include "zend_interfaces.h" @@ -184,7 +187,7 @@ PHP_FUNCTION(gnupg_keylistiterator_valid){ RETURN_FALSE; } } - +#endif /* ZEND_ENGINE_2 */ /* * Local variables: diff --git a/package.xml b/package.xml index 2b4c57b..301a16e 100644 --- a/package.xml +++ b/package.xml @@ -15,14 +15,14 @@ So you can sign, encrypt, verify directly from php - 0.3 + 0.4 2005-10-15 PHP License beta - added import/export methods and better errormessages + added procedual usage and lowered min PHP Version to 4.3 - + @@ -45,6 +45,12 @@ So you can sign, encrypt, verify directly from php + + 0.4 + 2005-10-17 + beta + added procedual usage and lowered min PHP Version to 4.3 + 0.3 2005-10-15 diff --git a/package2.xml b/package2.xml index 1093dfd..33981bc 100644 --- a/package2.xml +++ b/package2.xml @@ -16,18 +16,18 @@ So you can sign, encrypt, verify directly from php traufeisen@php.net yes - 2005-10-15 - + 2005-10-17 + - 0.3 - 0.3 + 0.4 + 0.4 beta beta PHP License - added import/export methods and better errormessages + added procedual usage and lowered min PHP Version to 4.3 @@ -56,7 +56,7 @@ So you can sign, encrypt, verify directly from php - 5.0 + 4.3 1.4.0b1 @@ -66,6 +66,20 @@ So you can sign, encrypt, verify directly from php gnupg + + + 0.4 + 0.4 + + + beta + beta + + 2005-10-17 + PHP License + added procedual usage and lowered min PHP Version to 4.3 + + 0.3 diff --git a/php_gnupg.h b/php_gnupg.h index e954bec..53c8741 100644 --- a/php_gnupg.h +++ b/php_gnupg.h @@ -41,6 +41,7 @@ typedef struct _gnupg_object{ zval passphrase; gpgme_key_t encryptkey; gpgme_error_t err; + char* errortxt; int signmode; } gnupg_object; @@ -73,6 +74,8 @@ PHP_FUNCTION(gnupg_decrypt); PHP_FUNCTION(gnupg_decryptverify); PHP_FUNCTION(gnupg_export); PHP_FUNCTION(gnupg_import); +PHP_FUNCTION(gnupg_init); + #ifdef ZTS #define GNUPG_G(v) TSRMG(gnupg_globals_id, zend_gnupg_globals *, v)