mirror of
https://github.com/php-gnupg/php-gnupg.git
synced 2024-11-22 06:27:08 +00:00
various memory optimizations
This commit is contained in:
parent
95ed1d656f
commit
1bf61c6980
3 changed files with 127 additions and 48 deletions
110
gnupg.c
110
gnupg.c
|
@ -67,7 +67,7 @@ static zend_object_handlers gnupg_object_handlers;
|
||||||
}else{ \
|
}else{ \
|
||||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, (char*)error); \
|
php_error_docref(NULL TSRMLS_CC, E_WARNING, (char*)error); \
|
||||||
} \
|
} \
|
||||||
RETURN_FALSE;
|
RETVAL_FALSE;
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
/* {{{ free encryptkeys */
|
/* {{{ free encryptkeys */
|
||||||
|
@ -554,6 +554,7 @@ PHP_FUNCTION(gnupg_keyinfo)
|
||||||
}
|
}
|
||||||
if((intern->err = gpgme_op_keylist_start(intern->ctx, searchkey, 0)) != GPG_ERR_NO_ERROR){
|
if((intern->err = gpgme_op_keylist_start(intern->ctx, searchkey, 0)) != GPG_ERR_NO_ERROR){
|
||||||
GNUPG_ERR("could not init keylist");
|
GNUPG_ERR("could not init keylist");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
array_init(return_value);
|
array_init(return_value);
|
||||||
|
@ -652,6 +653,7 @@ PHP_FUNCTION(gnupg_addsignkey){
|
||||||
}
|
}
|
||||||
if((intern->err = gpgme_get_key(intern->ctx, key_id, &gpgme_key, 1)) != GPG_ERR_NO_ERROR){
|
if((intern->err = gpgme_get_key(intern->ctx, key_id, &gpgme_key, 1)) != GPG_ERR_NO_ERROR){
|
||||||
GNUPG_ERR("get_key failed");
|
GNUPG_ERR("get_key failed");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
if(passphrase){
|
if(passphrase){
|
||||||
gpgme_subkey = gpgme_key->subkeys;
|
gpgme_subkey = gpgme_key->subkeys;
|
||||||
|
@ -664,10 +666,10 @@ PHP_FUNCTION(gnupg_addsignkey){
|
||||||
}
|
}
|
||||||
if((intern->err = gpgme_signers_add(intern->ctx, gpgme_key))!=GPG_ERR_NO_ERROR){
|
if((intern->err = gpgme_signers_add(intern->ctx, gpgme_key))!=GPG_ERR_NO_ERROR){
|
||||||
GNUPG_ERR("could not add signer");
|
GNUPG_ERR("could not add signer");
|
||||||
}
|
}else{
|
||||||
/* dont need the keyref anymore */
|
RETVAL_TRUE;
|
||||||
|
}
|
||||||
gpgme_key_unref(gpgme_key);
|
gpgme_key_unref(gpgme_key);
|
||||||
RETURN_TRUE;
|
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
|
@ -695,6 +697,7 @@ PHP_FUNCTION(gnupg_adddecryptkey){
|
||||||
}
|
}
|
||||||
if((intern->err = gpgme_get_key(intern->ctx, key_id, &gpgme_key, 1)) != GPG_ERR_NO_ERROR){
|
if((intern->err = gpgme_get_key(intern->ctx, key_id, &gpgme_key, 1)) != GPG_ERR_NO_ERROR){
|
||||||
GNUPG_ERR("get_key failed");
|
GNUPG_ERR("get_key failed");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
gpgme_subkey = gpgme_key->subkeys;
|
gpgme_subkey = gpgme_key->subkeys;
|
||||||
while(gpgme_subkey){
|
while(gpgme_subkey){
|
||||||
|
@ -730,6 +733,7 @@ PHP_FUNCTION(gnupg_addencryptkey){
|
||||||
|
|
||||||
if((intern->err = gpgme_get_key(intern->ctx, key_id, &gpgme_key, 0)) != GPG_ERR_NO_ERROR){
|
if((intern->err = gpgme_get_key(intern->ctx, key_id, &gpgme_key, 0)) != GPG_ERR_NO_ERROR){
|
||||||
GNUPG_ERR("get_key failed");
|
GNUPG_ERR("get_key failed");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
intern->encryptkeys = erealloc(intern->encryptkeys, sizeof(intern->encryptkeys) * (intern->encrypt_size + 1));
|
intern->encryptkeys = erealloc(intern->encryptkeys, sizeof(intern->encryptkeys) * (intern->encrypt_size + 1));
|
||||||
intern->encryptkeys[intern->encrypt_size] = gpgme_key;
|
intern->encryptkeys[intern->encrypt_size] = gpgme_key;
|
||||||
|
@ -825,19 +829,31 @@ PHP_FUNCTION(gnupg_sign){
|
||||||
gpgme_set_passphrase_cb (intern->ctx, (void*) passphrase_cb, intern);
|
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){
|
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");
|
GNUPG_ERR("could not create in-data buffer");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
if((intern->err = gpgme_data_new(&out))!=GPG_ERR_NO_ERROR){
|
if((intern->err = gpgme_data_new(&out))!=GPG_ERR_NO_ERROR){
|
||||||
GNUPG_ERR("could not create out-data buffer");
|
GNUPG_ERR("could not create out-data buffer");
|
||||||
|
gpgme_data_release(in);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
if((intern->err = gpgme_op_sign(intern->ctx, in, out, intern->signmode))!=GPG_ERR_NO_ERROR){
|
if((intern->err = gpgme_op_sign(intern->ctx, in, out, intern->signmode))!=GPG_ERR_NO_ERROR){
|
||||||
GNUPG_ERR("data signing failed");
|
GNUPG_ERR("data signing failed");
|
||||||
|
gpgme_data_release(in);
|
||||||
|
gpgme_data_release(out);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
result = gpgme_op_sign_result (intern->ctx);
|
result = gpgme_op_sign_result (intern->ctx);
|
||||||
if(result->invalid_signers){
|
if(result->invalid_signers){
|
||||||
GNUPG_ERR("invalid signers found");
|
GNUPG_ERR("invalid signers found");
|
||||||
|
gpgme_data_release(in);
|
||||||
|
gpgme_data_release(out);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
if(!result->signatures){
|
if(!result->signatures){
|
||||||
GNUPG_ERR("no signature in result");
|
GNUPG_ERR("no signature in result");
|
||||||
|
gpgme_data_release(in);
|
||||||
|
gpgme_data_release(out);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
userret = gpgme_data_release_and_get_mem(out,&ret_size);
|
userret = gpgme_data_release_and_get_mem(out,&ret_size);
|
||||||
if(ret_size < 1){
|
if(ret_size < 1){
|
||||||
|
@ -879,19 +895,29 @@ PHP_FUNCTION(gnupg_encrypt){
|
||||||
}
|
}
|
||||||
if(!intern->encryptkeys){
|
if(!intern->encryptkeys){
|
||||||
GNUPG_ERR("no key for encryption set");
|
GNUPG_ERR("no key for encryption set");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
if((intern->err = gpgme_data_new_from_mem (&in, value, value_len, 0))!=GPG_ERR_NO_ERROR){
|
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");
|
GNUPG_ERR("could no create in-data buffer");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
if((intern->err = gpgme_data_new(&out))!=GPG_ERR_NO_ERROR){
|
if((intern->err = gpgme_data_new(&out))!=GPG_ERR_NO_ERROR){
|
||||||
GNUPG_ERR("could not create out-data buffer");
|
GNUPG_ERR("could not create out-data buffer");
|
||||||
|
gpgme_data_release(in);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
if((intern->err = gpgme_op_encrypt(intern->ctx, intern->encryptkeys, GPGME_ENCRYPT_ALWAYS_TRUST, in, out))!=GPG_ERR_NO_ERROR){
|
if((intern->err = gpgme_op_encrypt(intern->ctx, intern->encryptkeys, GPGME_ENCRYPT_ALWAYS_TRUST, in, out))!=GPG_ERR_NO_ERROR){
|
||||||
GNUPG_ERR("encrypt failed");
|
GNUPG_ERR("encrypt failed");
|
||||||
|
gpgme_data_release(in);
|
||||||
|
gpgme_data_release(out);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
result = gpgme_op_encrypt_result (intern->ctx);
|
result = gpgme_op_encrypt_result (intern->ctx);
|
||||||
if (result->invalid_recipients){
|
if (result->invalid_recipients){
|
||||||
GNUPG_ERR("Invalid recipient encountered");
|
GNUPG_ERR("Invalid recipient encountered");
|
||||||
|
gpgme_data_release(in);
|
||||||
|
gpgme_data_release(out);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
userret = gpgme_data_release_and_get_mem(out,&ret_size);
|
userret = gpgme_data_release_and_get_mem(out,&ret_size);
|
||||||
gpgme_data_release (in);
|
gpgme_data_release (in);
|
||||||
|
@ -933,29 +959,45 @@ PHP_FUNCTION(gnupg_encryptsign){
|
||||||
|
|
||||||
if(!intern->encryptkeys){
|
if(!intern->encryptkeys){
|
||||||
GNUPG_ERR("no key for encryption set");
|
GNUPG_ERR("no key for encryption set");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
gpgme_set_passphrase_cb (intern->ctx, (void*) passphrase_cb, intern);
|
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){
|
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");
|
GNUPG_ERR("could not create in-data buffer");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
if((intern->err = gpgme_data_new(&out))!=GPG_ERR_NO_ERROR){
|
if((intern->err = gpgme_data_new(&out))!=GPG_ERR_NO_ERROR){
|
||||||
GNUPG_ERR("could not create out-data buffer");
|
GNUPG_ERR("could not create out-data buffer");
|
||||||
|
gpgme_data_release(in);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
if((intern->err = gpgme_op_encrypt_sign(intern->ctx, intern->encryptkeys, GPGME_ENCRYPT_ALWAYS_TRUST, in, out))!=GPG_ERR_NO_ERROR){
|
if((intern->err = gpgme_op_encrypt_sign(intern->ctx, intern->encryptkeys, GPGME_ENCRYPT_ALWAYS_TRUST, in, out))!=GPG_ERR_NO_ERROR){
|
||||||
GNUPG_ERR("encrypt-sign failed");
|
GNUPG_ERR("encrypt-sign failed");
|
||||||
|
gpgme_data_release(in);
|
||||||
|
gpgme_data_release(out);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = gpgme_op_encrypt_result (intern->ctx);
|
result = gpgme_op_encrypt_result (intern->ctx);
|
||||||
if (result->invalid_recipients){
|
if (result->invalid_recipients){
|
||||||
GNUPG_ERR("Invalid recipient encountered");
|
GNUPG_ERR("Invalid recipient encountered");
|
||||||
|
gpgme_data_release(in);
|
||||||
|
gpgme_data_release(out);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sign_result = gpgme_op_sign_result (intern->ctx);
|
sign_result = gpgme_op_sign_result (intern->ctx);
|
||||||
if(sign_result->invalid_signers){
|
if(sign_result->invalid_signers){
|
||||||
GNUPG_ERR("invalid signers found");
|
GNUPG_ERR("invalid signers found");
|
||||||
|
gpgme_data_release(in);
|
||||||
|
gpgme_data_release(out);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
if(!sign_result->signatures){
|
if(!sign_result->signatures){
|
||||||
GNUPG_ERR("could not find a signature");
|
GNUPG_ERR("could not find a signature");
|
||||||
|
gpgme_data_release(in);
|
||||||
|
gpgme_data_release(out);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
userret = gpgme_data_release_and_get_mem(out,&ret_size);
|
userret = gpgme_data_release_and_get_mem(out,&ret_size);
|
||||||
|
@ -1001,9 +1043,12 @@ PHP_FUNCTION(gnupg_verify){
|
||||||
if(Z_STRVAL_P(signature)){
|
if(Z_STRVAL_P(signature)){
|
||||||
if((intern->err = gpgme_data_new_from_mem (&gpgme_sig, Z_STRVAL_P(signature), Z_STRLEN_P(signature), 0))!=GPG_ERR_NO_ERROR){
|
if((intern->err = gpgme_data_new_from_mem (&gpgme_sig, Z_STRVAL_P(signature), Z_STRLEN_P(signature), 0))!=GPG_ERR_NO_ERROR){
|
||||||
GNUPG_ERR("could not create signature-databuffer");
|
GNUPG_ERR("could not create signature-databuffer");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
if((intern->err = gpgme_data_new (&gpgme_text))!=GPG_ERR_NO_ERROR){
|
if((intern->err = gpgme_data_new (&gpgme_text))!=GPG_ERR_NO_ERROR){
|
||||||
GNUPG_ERR("could not create text-databuffer");
|
GNUPG_ERR("could not create text-databuffer");
|
||||||
|
gpgme_data_release(gpgme_sig);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
/* no separate signature was passed
|
/* no separate signature was passed
|
||||||
|
@ -1013,23 +1058,31 @@ PHP_FUNCTION(gnupg_verify){
|
||||||
*/
|
*/
|
||||||
if((intern->err = gpgme_data_new_from_mem (&gpgme_sig, text, text_len, 0))!=GPG_ERR_NO_ERROR){
|
if((intern->err = gpgme_data_new_from_mem (&gpgme_sig, text, text_len, 0))!=GPG_ERR_NO_ERROR){
|
||||||
GNUPG_ERR("could not create signature-databuffer");
|
GNUPG_ERR("could not create signature-databuffer");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
if((intern->err = gpgme_data_new_from_mem (&gpgme_text, NULL, 0, 0))!=GPG_ERR_NO_ERROR){
|
if((intern->err = gpgme_data_new_from_mem (&gpgme_text, NULL, 0, 0))!=GPG_ERR_NO_ERROR){
|
||||||
GNUPG_ERR("could not create text-databuffer");
|
GNUPG_ERR("could not create text-databuffer");
|
||||||
|
gpgme_data_release(gpgme_sig);
|
||||||
|
gpgme_data_release(gpgme_text);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if((intern->err = gpgme_op_verify (intern->ctx, gpgme_sig, NULL, gpgme_text))!=GPG_ERR_NO_ERROR){
|
if((intern->err = gpgme_op_verify (intern->ctx, gpgme_sig, NULL, gpgme_text))!=GPG_ERR_NO_ERROR){
|
||||||
GNUPG_ERR("verify failed");
|
GNUPG_ERR("verify failed");
|
||||||
|
gpgme_data_release(gpgme_sig);
|
||||||
|
gpgme_data_release(gpgme_text);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
gpgme_result = gpgme_op_verify_result (intern->ctx);
|
gpgme_result = gpgme_op_verify_result (intern->ctx);
|
||||||
if(!gpgme_result->signatures){
|
if(!gpgme_result->signatures){
|
||||||
GNUPG_ERR ("no signature found");
|
GNUPG_ERR ("no signature found");
|
||||||
}
|
}else{
|
||||||
gnupg_fetchsignatures (gpgme_result->signatures,sig_arr,return_value);
|
gnupg_fetchsignatures (gpgme_result->signatures,sig_arr,return_value);
|
||||||
gpg_plain = gpgme_data_release_and_get_mem(gpgme_text,&gpg_plain_len);
|
gpg_plain = gpgme_data_release_and_get_mem(gpgme_text,&gpg_plain_len);
|
||||||
if(plaintext){
|
if(plaintext){
|
||||||
ZVAL_STRINGL (plaintext,gpg_plain,gpg_plain_len,1);
|
ZVAL_STRINGL (plaintext,gpg_plain,gpg_plain_len,1);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
gpgme_data_release (gpgme_sig);
|
gpgme_data_release (gpgme_sig);
|
||||||
free (gpgme_text);
|
free (gpgme_text);
|
||||||
free (gpg_plain);
|
free (gpg_plain);
|
||||||
|
@ -1069,14 +1122,22 @@ PHP_FUNCTION(gnupg_decrypt){
|
||||||
}
|
}
|
||||||
if((intern->err = gpgme_data_new (&out))!=GPG_ERR_NO_ERROR){
|
if((intern->err = gpgme_data_new (&out))!=GPG_ERR_NO_ERROR){
|
||||||
GNUPG_ERR("could not create out-data buffer");
|
GNUPG_ERR("could not create out-data buffer");
|
||||||
|
gpgme_data_release(in);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
if((intern->err = gpgme_op_decrypt (intern->ctx, in, out))!=GPG_ERR_NO_ERROR){
|
if((intern->err = gpgme_op_decrypt (intern->ctx, in, out))!=GPG_ERR_NO_ERROR){
|
||||||
GNUPG_ERR("decrypt failed");
|
GNUPG_ERR("decrypt failed");
|
||||||
|
gpgme_data_release(in);
|
||||||
|
gpgme_data_release(out);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
result = gpgme_op_decrypt_result (intern->ctx);
|
result = gpgme_op_decrypt_result (intern->ctx);
|
||||||
if (result->unsupported_algorithm){
|
if (result->unsupported_algorithm){
|
||||||
GNUPG_ERR("unsupported algorithm");
|
GNUPG_ERR("unsupported algorithm");
|
||||||
}
|
gpgme_data_release(in);
|
||||||
|
gpgme_data_release(out);
|
||||||
|
return;
|
||||||
|
}
|
||||||
userret = gpgme_data_release_and_get_mem(out,&ret_size);
|
userret = gpgme_data_release_and_get_mem(out,&ret_size);
|
||||||
gpgme_data_release (in);
|
gpgme_data_release (in);
|
||||||
free (out);
|
free (out);
|
||||||
|
@ -1125,9 +1186,14 @@ PHP_FUNCTION(gnupg_decryptverify){
|
||||||
}
|
}
|
||||||
if((intern->err = gpgme_data_new (&out))!=GPG_ERR_NO_ERROR){
|
if((intern->err = gpgme_data_new (&out))!=GPG_ERR_NO_ERROR){
|
||||||
GNUPG_ERR("could not create out-data buffer");
|
GNUPG_ERR("could not create out-data buffer");
|
||||||
|
gpgme_data_release(in);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
if((intern->err = gpgme_op_decrypt_verify (intern->ctx, in, out))!=GPG_ERR_NO_ERROR){
|
if((intern->err = gpgme_op_decrypt_verify (intern->ctx, in, out))!=GPG_ERR_NO_ERROR){
|
||||||
GNUPG_ERR("decrypt-verify failed");
|
GNUPG_ERR("decrypt-verify failed");
|
||||||
|
gpgme_data_release(in);
|
||||||
|
gpgme_data_release(out);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
userret = gpgme_data_release_and_get_mem(out,&ret_size);
|
userret = gpgme_data_release_and_get_mem(out,&ret_size);
|
||||||
ZVAL_STRINGL (plaintext,userret,ret_size,1);
|
ZVAL_STRINGL (plaintext,userret,ret_size,1);
|
||||||
|
@ -1135,10 +1201,16 @@ PHP_FUNCTION(gnupg_decryptverify){
|
||||||
decrypt_result = gpgme_op_decrypt_result (intern->ctx);
|
decrypt_result = gpgme_op_decrypt_result (intern->ctx);
|
||||||
if (decrypt_result->unsupported_algorithm){
|
if (decrypt_result->unsupported_algorithm){
|
||||||
GNUPG_ERR ("unsupported algorithm");
|
GNUPG_ERR ("unsupported algorithm");
|
||||||
|
gpgme_data_release(in);
|
||||||
|
free(out);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
verify_result = gpgme_op_verify_result (intern->ctx);
|
verify_result = gpgme_op_verify_result (intern->ctx);
|
||||||
if(!verify_result->signatures){
|
if(!verify_result->signatures){
|
||||||
GNUPG_ERR ("no signature found");
|
GNUPG_ERR ("no signature found");
|
||||||
|
gpgme_data_release(in);
|
||||||
|
free(out);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
gnupg_fetchsignatures (verify_result->signatures,sig_arr,return_value);
|
gnupg_fetchsignatures (verify_result->signatures,sig_arr,return_value);
|
||||||
gpgme_data_release (in);
|
gpgme_data_release (in);
|
||||||
|
@ -1171,9 +1243,12 @@ PHP_FUNCTION(gnupg_export){
|
||||||
}
|
}
|
||||||
if((intern->err = gpgme_data_new (&out))!=GPG_ERR_NO_ERROR){
|
if((intern->err = gpgme_data_new (&out))!=GPG_ERR_NO_ERROR){
|
||||||
GNUPG_ERR("could not create data buffer");
|
GNUPG_ERR("could not create data buffer");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
if((intern->err = gpgme_op_export (intern->ctx, searchkey, 0, out))!=GPG_ERR_NO_ERROR){
|
if((intern->err = gpgme_op_export (intern->ctx, searchkey, 0, out))!=GPG_ERR_NO_ERROR){
|
||||||
GNUPG_ERR("export failed");
|
GNUPG_ERR("export failed");
|
||||||
|
gpgme_data_release(out);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
userret = gpgme_data_release_and_get_mem(out,&ret_size);
|
userret = gpgme_data_release_and_get_mem(out,&ret_size);
|
||||||
RETVAL_STRINGL (userret,ret_size,1);
|
RETVAL_STRINGL (userret,ret_size,1);
|
||||||
|
@ -1209,9 +1284,12 @@ PHP_FUNCTION(gnupg_import){
|
||||||
}
|
}
|
||||||
if((intern->err = gpgme_data_new_from_mem (&in, importkey, importkey_len, 0))!=GPG_ERR_NO_ERROR){
|
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");
|
GNUPG_ERR("could not create in-data buffer");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
if((intern->err = gpgme_op_import(intern->ctx,in))!=GPG_ERR_NO_ERROR){
|
if((intern->err = gpgme_op_import(intern->ctx,in))!=GPG_ERR_NO_ERROR){
|
||||||
GNUPG_ERR("import failed");
|
GNUPG_ERR("import failed");
|
||||||
|
gpgme_data_release(in);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
gpgme_data_release(in);
|
gpgme_data_release(in);
|
||||||
result = gpgme_op_import_result (intern->ctx);
|
result = gpgme_op_import_result (intern->ctx);
|
||||||
|
@ -1254,12 +1332,15 @@ PHP_FUNCTION(gnupg_deletekey){
|
||||||
|
|
||||||
if((intern->err = gpgme_get_key(intern->ctx, key, &gpgme_key, 0)) != GPG_ERR_NO_ERROR){
|
if((intern->err = gpgme_get_key(intern->ctx, key, &gpgme_key, 0)) != GPG_ERR_NO_ERROR){
|
||||||
GNUPG_ERR("get_key failed");
|
GNUPG_ERR("get_key failed");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
if((intern->err = gpgme_op_delete(intern->ctx,gpgme_key,allow_secret))!=GPG_ERR_NO_ERROR){
|
if((intern->err = gpgme_op_delete(intern->ctx,gpgme_key,allow_secret))!=GPG_ERR_NO_ERROR){
|
||||||
GNUPG_ERR("delete failed");
|
GNUPG_ERR("delete failed");
|
||||||
|
RETVAL_FALSE;
|
||||||
|
}else{
|
||||||
|
RETVAL_TRUE;
|
||||||
}
|
}
|
||||||
gpgme_key_unref(gpgme_key);
|
gpgme_key_unref(gpgme_key);
|
||||||
RETURN_TRUE;
|
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
|
@ -1287,6 +1368,7 @@ PHP_FUNCTION(gnupg_gettrustlist){
|
||||||
}
|
}
|
||||||
if((intern->err = gpgme_op_trustlist_start (intern->ctx, pattern, 0))!=GPG_ERR_NO_ERROR){
|
if((intern->err = gpgme_op_trustlist_start (intern->ctx, pattern, 0))!=GPG_ERR_NO_ERROR){
|
||||||
GNUPG_ERR("could not start trustlist");
|
GNUPG_ERR("could not start trustlist");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
array_init(return_value);
|
array_init(return_value);
|
||||||
while (!(intern->err = gpgme_op_trustlist_next (intern->ctx, &item))){
|
while (!(intern->err = gpgme_op_trustlist_next (intern->ctx, &item))){
|
||||||
|
@ -1332,12 +1414,16 @@ PHP_FUNCTION(gnupg_listsignatures){
|
||||||
}
|
}
|
||||||
if((intern->err = gpgme_set_keylist_mode(intern->ctx,GPGME_KEYLIST_MODE_SIGS))!=GPG_ERR_NO_ERROR){
|
if((intern->err = gpgme_set_keylist_mode(intern->ctx,GPGME_KEYLIST_MODE_SIGS))!=GPG_ERR_NO_ERROR){
|
||||||
GNUPG_ERR("could not switch to sigmode");
|
GNUPG_ERR("could not switch to sigmode");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
if((intern->err = gpgme_get_key(intern->ctx, keyid, &gpgme_key, 0)) != GPG_ERR_NO_ERROR){
|
if((intern->err = gpgme_get_key(intern->ctx, keyid, &gpgme_key, 0)) != GPG_ERR_NO_ERROR){
|
||||||
GNUPG_ERR("get_key failed. given key not unique?");
|
GNUPG_ERR("get_key failed. given key not unique?");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
if(!gpgme_key->uids){
|
if(!gpgme_key->uids){
|
||||||
GNUPG_ERR("no uids found");
|
GNUPG_ERR("no uids found");
|
||||||
|
gpgme_key_unref(gpgme_key);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
array_init(return_value);
|
array_init(return_value);
|
||||||
gpgme_userid = gpgme_key->uids;
|
gpgme_userid = gpgme_key->uids;
|
||||||
|
|
|
@ -37,31 +37,29 @@ static int le_gnupg_keylistiterator;
|
||||||
static zend_object_handlers gnupg_keylistiterator_object_handlers;
|
static zend_object_handlers gnupg_keylistiterator_object_handlers;
|
||||||
|
|
||||||
/* {{{ defs */
|
/* {{{ defs */
|
||||||
|
|
||||||
#define GNUPG_GET_ITERATOR() \
|
#define GNUPG_GET_ITERATOR() \
|
||||||
|
zval *this = getThis(); \
|
||||||
gnupg_keylistiterator_object *intern; \
|
gnupg_keylistiterator_object *intern; \
|
||||||
ze_gnupg_keylistiterator_object *obj = (ze_gnupg_keylistiterator_object*) zend_object_store_get_object(getThis() TSRMLS_CC); \
|
if(this){ \
|
||||||
intern = obj->gnupg_keylistiterator_ptr; \
|
intern = (gnupg_keylistiterator_object*) zend_object_store_get_object(getThis() TSRMLS_CC); \
|
||||||
if(!intern){ \
|
if(!intern){ \
|
||||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid or unitialized gnupg iterator object"); \
|
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid or unitialized gnupg object"); \
|
||||||
RETURN_FALSE; \
|
RETURN_FALSE; \
|
||||||
}
|
} \
|
||||||
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
/* {{{ free_iterator_storage */
|
/* {{{ free_iterator_storage */
|
||||||
static void gnupg_keylistiterator_object_free_storage(void *object TSRMLS_DC){
|
static void gnupg_keylistiterator_dtor(gnupg_keylistiterator_object *intern TSRMLS_DC){
|
||||||
ze_gnupg_keylistiterator_object *intern = (ze_gnupg_keylistiterator_object *) object;
|
|
||||||
if(!intern){
|
if(!intern){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(intern->gnupg_keylistiterator_ptr){
|
gpgme_op_keylist_end(intern->ctx);
|
||||||
gpgme_op_keylist_end(intern->gnupg_keylistiterator_ptr->ctx);
|
gpgme_key_release(intern->gpgkey);
|
||||||
gpgme_key_release(intern->gnupg_keylistiterator_ptr->gpgkey);
|
gpgme_release(intern->ctx);
|
||||||
gpgme_release(intern->gnupg_keylistiterator_ptr->ctx);
|
/*
|
||||||
zval_dtor(&intern->gnupg_keylistiterator_ptr->pattern);
|
zval_dtor(&intern->pattern);
|
||||||
efree(intern->gnupg_keylistiterator_ptr);
|
*/
|
||||||
}
|
|
||||||
if(intern->zo.properties){
|
if(intern->zo.properties){
|
||||||
zend_hash_destroy(intern->zo.properties);
|
zend_hash_destroy(intern->zo.properties);
|
||||||
FREE_HASHTABLE(intern->zo.properties);
|
FREE_HASHTABLE(intern->zo.properties);
|
||||||
|
@ -72,25 +70,20 @@ static void gnupg_keylistiterator_object_free_storage(void *object TSRMLS_DC){
|
||||||
|
|
||||||
/* {{{ keylistiterator_objects_new */
|
/* {{{ keylistiterator_objects_new */
|
||||||
zend_object_value gnupg_keylistiterator_objects_new(zend_class_entry *class_type TSRMLS_DC){
|
zend_object_value gnupg_keylistiterator_objects_new(zend_class_entry *class_type TSRMLS_DC){
|
||||||
ze_gnupg_keylistiterator_object *intern;
|
gnupg_keylistiterator_object *intern;
|
||||||
zend_object_value retval;
|
zend_object_value retval;
|
||||||
gnupg_keylistiterator_object *gnupg_keylistiterator_ptr;
|
|
||||||
gpgme_ctx_t ctx;
|
gpgme_ctx_t ctx;
|
||||||
|
|
||||||
intern = emalloc(sizeof(ze_gnupg_keylistiterator_object));
|
intern = emalloc(sizeof(gnupg_keylistiterator_object));
|
||||||
intern->zo.ce = class_type;
|
intern->zo.ce = class_type;
|
||||||
intern->zo.in_get = 0;
|
intern->zo.in_get = 0;
|
||||||
intern->zo.in_set = 0;
|
intern->zo.in_set = 0;
|
||||||
intern->zo.properties = NULL;
|
intern->zo.properties = NULL;
|
||||||
retval.handle = zend_objects_store_put(intern,NULL,(zend_objects_free_object_storage_t) gnupg_keylistiterator_object_free_storage,NULL TSRMLS_CC);
|
retval.handle = zend_objects_store_put(intern,NULL,(zend_objects_free_object_storage_t) gnupg_keylistiterator_dtor,NULL TSRMLS_CC);
|
||||||
retval.handlers = (zend_object_handlers *) & gnupg_keylistiterator_object_handlers;
|
retval.handlers = (zend_object_handlers *) & gnupg_keylistiterator_object_handlers;
|
||||||
|
|
||||||
gpgme_new(&ctx);
|
gpgme_new(&ctx);
|
||||||
gnupg_keylistiterator_ptr = emalloc(sizeof(gnupg_keylistiterator_object));
|
intern->ctx = ctx;
|
||||||
gnupg_keylistiterator_ptr->ctx = ctx;
|
|
||||||
|
|
||||||
intern->gnupg_keylistiterator_ptr = gnupg_keylistiterator_ptr;
|
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
@ -141,7 +134,7 @@ PHP_FUNCTION(gnupg_keylistiterator___construct){
|
||||||
intern->pattern = *pattern;
|
intern->pattern = *pattern;
|
||||||
zval_copy_ctor(&intern->pattern);
|
zval_copy_ctor(&intern->pattern);
|
||||||
}else{
|
}else{
|
||||||
convert_to_string(&intern->pattern);
|
ZVAL_EMPTY_STRING(&intern->pattern);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
PHP_FUNCTION(gnupg_keylistiterator_current){
|
PHP_FUNCTION(gnupg_keylistiterator_current){
|
||||||
|
@ -159,6 +152,10 @@ PHP_FUNCTION(gnupg_keylistiterator_key){
|
||||||
PHP_FUNCTION(gnupg_keylistiterator_next){
|
PHP_FUNCTION(gnupg_keylistiterator_next){
|
||||||
GNUPG_GET_ITERATOR();
|
GNUPG_GET_ITERATOR();
|
||||||
|
|
||||||
|
if(intern->gpgkey){
|
||||||
|
gpgme_key_release(intern->gpgkey);
|
||||||
|
}
|
||||||
|
|
||||||
if(intern->err = gpgme_op_keylist_next(intern->ctx, &intern->gpgkey)){
|
if(intern->err = gpgme_op_keylist_next(intern->ctx, &intern->gpgkey)){
|
||||||
gpgme_key_release(intern->gpgkey);
|
gpgme_key_release(intern->gpgkey);
|
||||||
intern->gpgkey = NULL;
|
intern->gpgkey = NULL;
|
||||||
|
|
|
@ -39,16 +39,12 @@ extern zend_module_entry gnupg_keyiterator_module_entry;
|
||||||
extern int _gnupg_keylistiterator_init(INIT_FUNC_ARGS);
|
extern int _gnupg_keylistiterator_init(INIT_FUNC_ARGS);
|
||||||
|
|
||||||
typedef struct _gnupg_keylistiterator_object{
|
typedef struct _gnupg_keylistiterator_object{
|
||||||
gpgme_ctx_t ctx;
|
|
||||||
gpgme_error_t err;
|
|
||||||
gpgme_key_t gpgkey;
|
|
||||||
zval pattern;
|
|
||||||
} gnupg_keylistiterator_object;
|
|
||||||
|
|
||||||
typedef struct _ze_gnupg_keylistiterator_object{
|
|
||||||
zend_object zo;
|
zend_object zo;
|
||||||
gnupg_keylistiterator_object *gnupg_keylistiterator_ptr;
|
gpgme_ctx_t ctx;
|
||||||
} ze_gnupg_keylistiterator_object;
|
gpgme_error_t err;
|
||||||
|
gpgme_key_t gpgkey;
|
||||||
|
zval pattern;
|
||||||
|
} gnupg_keylistiterator_object;
|
||||||
|
|
||||||
zend_class_entry *gnupg_keylistiterator_class_entry;
|
zend_class_entry *gnupg_keylistiterator_class_entry;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue