mirror of
https://github.com/php-gnupg/php-gnupg.git
synced 2024-11-22 22:37:10 +00:00
definition of separate passphrases per signkey is now possible
setsignkey now takes an optional second parameter for the passphrase setpassphrase was removed
This commit is contained in:
parent
d927552662
commit
012e445989
2 changed files with 34 additions and 38 deletions
69
gnupg.c
69
gnupg.c
|
@ -79,8 +79,9 @@ static void gnupg_free_resource_ptr(gnupg_object *intern TSRMLS_DC){
|
||||||
gpgme_release (intern->ctx);
|
gpgme_release (intern->ctx);
|
||||||
intern->ctx = NULL;
|
intern->ctx = NULL;
|
||||||
}
|
}
|
||||||
zval_dtor(&intern->passphrase);
|
|
||||||
gnupg_free_encryptkeys(intern);
|
gnupg_free_encryptkeys(intern);
|
||||||
|
zend_hash_destroy(intern->signkeys);
|
||||||
|
FREE_HASHTABLE(intern->signkeys);
|
||||||
efree(intern);
|
efree(intern);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -143,6 +144,8 @@ zend_object_value gnupg_objects_new(zend_class_entry *class_type TSRMLS_DC){
|
||||||
gnupg_ptr->encryptkeys = NULL;
|
gnupg_ptr->encryptkeys = NULL;
|
||||||
gnupg_ptr->encrypt_size= 0;
|
gnupg_ptr->encrypt_size= 0;
|
||||||
gnupg_ptr->signmode = GPGME_SIG_MODE_CLEAR;
|
gnupg_ptr->signmode = GPGME_SIG_MODE_CLEAR;
|
||||||
|
ALLOC_HASHTABLE(gnupg_ptr->signkeys);
|
||||||
|
zend_hash_init(gnupg_ptr->signkeys, 0, NULL, NULL, 0);
|
||||||
intern->gnupg_ptr = gnupg_ptr;
|
intern->gnupg_ptr = gnupg_ptr;
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
|
@ -154,7 +157,6 @@ static zend_function_entry gnupg_methods[] = {
|
||||||
ZEND_ME(gnupg, keyinfo, NULL, ZEND_ACC_PUBLIC)
|
ZEND_ME(gnupg, keyinfo, NULL, ZEND_ACC_PUBLIC)
|
||||||
ZEND_ME(gnupg, verify, NULL, ZEND_ACC_PUBLIC)
|
ZEND_ME(gnupg, verify, NULL, ZEND_ACC_PUBLIC)
|
||||||
ZEND_ME(gnupg, geterror, NULL, ZEND_ACC_PUBLIC)
|
ZEND_ME(gnupg, geterror, NULL, ZEND_ACC_PUBLIC)
|
||||||
ZEND_ME(gnupg, setpassphrase, NULL, ZEND_ACC_PUBLIC)
|
|
||||||
ZEND_ME(gnupg, clearsignkeys, NULL, ZEND_ACC_PUBLIC)
|
ZEND_ME(gnupg, clearsignkeys, NULL, ZEND_ACC_PUBLIC)
|
||||||
ZEND_ME(gnupg, clearencryptkeys, NULL, ZEND_ACC_PUBLIC)
|
ZEND_ME(gnupg, clearencryptkeys, NULL, ZEND_ACC_PUBLIC)
|
||||||
ZEND_ME(gnupg, setarmor, NULL, ZEND_ACC_PUBLIC)
|
ZEND_ME(gnupg, setarmor, NULL, ZEND_ACC_PUBLIC)
|
||||||
|
@ -175,7 +177,6 @@ static zend_function_entry gnupg_methods[] = {
|
||||||
static zend_function_entry gnupg_functions[] = {
|
static zend_function_entry gnupg_functions[] = {
|
||||||
PHP_FE(gnupg_init, NULL)
|
PHP_FE(gnupg_init, NULL)
|
||||||
PHP_FE(gnupg_keyinfo, NULL)
|
PHP_FE(gnupg_keyinfo, NULL)
|
||||||
PHP_FE(gnupg_setpassphrase, NULL)
|
|
||||||
PHP_FE(gnupg_sign, NULL)
|
PHP_FE(gnupg_sign, NULL)
|
||||||
PHP_FE(gnupg_verify, NULL)
|
PHP_FE(gnupg_verify, NULL)
|
||||||
PHP_FE(gnupg_clearsignkeys, NULL)
|
PHP_FE(gnupg_clearsignkeys, NULL)
|
||||||
|
@ -322,18 +323,29 @@ PHP_MINFO_FUNCTION(gnupg)
|
||||||
/* {{{ callback func for setting the passphrase
|
/* {{{ callback func for setting the passphrase
|
||||||
*/
|
*/
|
||||||
gpgme_error_t passphrase_cb (gnupg_object *intern, const char *uid_hint, const char *passphrase_info,int last_was_bad, int fd){
|
gpgme_error_t passphrase_cb (gnupg_object *intern, const char *uid_hint, const char *passphrase_info,int last_was_bad, int fd){
|
||||||
|
char uid[16];
|
||||||
|
int idx;
|
||||||
|
char *passphrase;
|
||||||
|
|
||||||
if(last_was_bad){
|
if(last_was_bad){
|
||||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Incorrent passphrase");
|
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Incorrent passphrase");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if(Z_STRLEN(intern->passphrase) < 1){
|
for(idx=0;idx<16;idx++){
|
||||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "no passphrase set");
|
uid[idx] = uid_hint[idx];
|
||||||
|
}
|
||||||
|
uid[16] = '\0';
|
||||||
|
if(zend_hash_find(intern->signkeys,(char *) uid,17,(void **) &passphrase)==FAILURE){
|
||||||
|
php_error_docref(NULL TSRMLS_CC, E_WARNING, "no passphrase set 1");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
write (fd, Z_STRVAL(intern->passphrase), Z_STRLEN(intern->passphrase));
|
if(!passphrase){
|
||||||
|
php_error_docref(NULL TSRMLS_CC, E_WARNING, "no passphrase set 2");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
write (fd, passphrase, strlen(passphrase));
|
||||||
write (fd, "\n", 1);
|
write (fd, "\n", 1);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
|
@ -417,32 +429,6 @@ PHP_FUNCTION(gnupg_setsignmode){
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
/* {{{ proto bool gnupg_setpassphrase(string passphrase)
|
|
||||||
* sets the passphrase for all next operations
|
|
||||||
*/
|
|
||||||
PHP_FUNCTION(gnupg_setpassphrase){
|
|
||||||
zval *tmp;
|
|
||||||
zval *res;
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
intern->passphrase = *tmp;
|
|
||||||
zval_copy_ctor(&intern->passphrase);
|
|
||||||
RETURN_TRUE;
|
|
||||||
}
|
|
||||||
/* }}} */
|
|
||||||
|
|
||||||
/* {{{ proto string gnupg_geterror(void)
|
/* {{{ proto string gnupg_geterror(void)
|
||||||
* returns the last errormessage
|
* returns the last errormessage
|
||||||
*/
|
*/
|
||||||
|
@ -581,19 +567,21 @@ PHP_FUNCTION(gnupg_keyinfo)
|
||||||
PHP_FUNCTION(gnupg_addsignkey){
|
PHP_FUNCTION(gnupg_addsignkey){
|
||||||
char *key_id = NULL;
|
char *key_id = NULL;
|
||||||
int key_id_len;
|
int key_id_len;
|
||||||
|
char *passphrase = NULL;
|
||||||
|
int passphrase_len;
|
||||||
zval *res;
|
zval *res;
|
||||||
|
|
||||||
gpgme_sign_result_t result;
|
|
||||||
gpgme_key_t gpgme_key;
|
gpgme_key_t gpgme_key;
|
||||||
|
gpgme_subkey_t gpgme_subkey;
|
||||||
|
|
||||||
GNUPG_GETOBJ();
|
GNUPG_GETOBJ();
|
||||||
|
|
||||||
if(this){
|
if(this){
|
||||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &key_id, &key_id_len) == FAILURE){
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s", &key_id, &key_id_len, &passphrase, &passphrase_len) == FAILURE){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &res, &key_id, &key_id_len) == FAILURE){
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs|s", &res, &key_id, &key_id_len, &passphrase, &passphrase_len) == FAILURE){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ZEND_FETCH_RESOURCE(intern,gnupg_object *, &res, -1, "ctx", le_gnupg);
|
ZEND_FETCH_RESOURCE(intern,gnupg_object *, &res, -1, "ctx", le_gnupg);
|
||||||
|
@ -601,6 +589,15 @@ 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");
|
||||||
}
|
}
|
||||||
|
if(passphrase){
|
||||||
|
gpgme_subkey = gpgme_key->subkeys;
|
||||||
|
while(gpgme_subkey){
|
||||||
|
if(gpgme_subkey->can_sign == 1){
|
||||||
|
zend_hash_add(intern->signkeys, (char *) gpgme_subkey->keyid, (uint) strlen(gpgme_subkey->keyid)+1, passphrase, (uint) passphrase_len+1, NULL);
|
||||||
|
}
|
||||||
|
gpgme_subkey = gpgme_subkey->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
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");
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,12 +38,12 @@ extern zend_module_entry gnupg_module_entry;
|
||||||
|
|
||||||
typedef struct _gnupg_object{
|
typedef struct _gnupg_object{
|
||||||
gpgme_ctx_t ctx;
|
gpgme_ctx_t ctx;
|
||||||
zval passphrase;
|
|
||||||
gpgme_error_t err;
|
gpgme_error_t err;
|
||||||
char* errortxt;
|
char* errortxt;
|
||||||
int signmode;
|
int signmode;
|
||||||
gpgme_key_t *encryptkeys;
|
gpgme_key_t *encryptkeys;
|
||||||
unsigned int encrypt_size;
|
unsigned int encrypt_size;
|
||||||
|
HashTable *signkeys;
|
||||||
} gnupg_object;
|
} gnupg_object;
|
||||||
|
|
||||||
typedef struct _ze_gnupg_object{
|
typedef struct _ze_gnupg_object{
|
||||||
|
@ -61,7 +61,6 @@ PHP_FUNCTION(gnupg_construct);
|
||||||
PHP_FUNCTION(gnupg_keyinfo);
|
PHP_FUNCTION(gnupg_keyinfo);
|
||||||
PHP_FUNCTION(gnupg_verify);
|
PHP_FUNCTION(gnupg_verify);
|
||||||
PHP_FUNCTION(gnupg_geterror);
|
PHP_FUNCTION(gnupg_geterror);
|
||||||
PHP_FUNCTION(gnupg_setpassphrase);
|
|
||||||
PHP_FUNCTION(gnupg_setsignmode);
|
PHP_FUNCTION(gnupg_setsignmode);
|
||||||
PHP_FUNCTION(gnupg_setarmor);
|
PHP_FUNCTION(gnupg_setarmor);
|
||||||
PHP_FUNCTION(gnupg_sign);
|
PHP_FUNCTION(gnupg_sign);
|
||||||
|
|
Loading…
Reference in a new issue