mirror of
https://github.com/profanity-im/profanity.git
synced 2024-11-03 19:37:16 -05:00
PGP: Also encrypt using sender public key
This commit is contained in:
parent
18555ffcb4
commit
7b138b71db
@ -593,7 +593,7 @@ p_gpg_sign(const char *const str, const char *const fp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
char*
|
char*
|
||||||
p_gpg_encrypt(const char *const barejid, const char *const message)
|
p_gpg_encrypt(const char *const barejid, const char *const message, const char *const fp)
|
||||||
{
|
{
|
||||||
ProfPGPPubKeyId *pubkeyid = g_hash_table_lookup(pubkeys, barejid);
|
ProfPGPPubKeyId *pubkeyid = g_hash_table_lookup(pubkeys, barejid);
|
||||||
if (!pubkeyid) {
|
if (!pubkeyid) {
|
||||||
@ -607,6 +607,7 @@ p_gpg_encrypt(const char *const barejid, const char *const message)
|
|||||||
|
|
||||||
keys[0] = NULL;
|
keys[0] = NULL;
|
||||||
keys[1] = NULL;
|
keys[1] = NULL;
|
||||||
|
keys[2] = NULL;
|
||||||
|
|
||||||
gpgme_ctx_t ctx;
|
gpgme_ctx_t ctx;
|
||||||
gpgme_error_t error = gpgme_new(&ctx);
|
gpgme_error_t error = gpgme_new(&ctx);
|
||||||
@ -615,16 +616,23 @@ p_gpg_encrypt(const char *const barejid, const char *const message)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
gpgme_key_t key;
|
gpgme_key_t receiver_key;
|
||||||
error = gpgme_get_key(ctx, pubkeyid->id, &key, 0);
|
error = gpgme_get_key(ctx, pubkeyid->id, &receiver_key, 0);
|
||||||
|
if (error || receiver_key == NULL) {
|
||||||
if (error || key == NULL) {
|
log_error("GPG: Failed to get receiver_key. %s %s", gpgme_strsource(error), gpgme_strerror(error));
|
||||||
log_error("GPG: Failed to get key. %s %s", gpgme_strsource(error), gpgme_strerror(error));
|
|
||||||
gpgme_release(ctx);
|
gpgme_release(ctx);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
keys[0] = receiver_key;
|
||||||
|
|
||||||
keys[0] = key;
|
gpgme_key_t sender_key = NULL;
|
||||||
|
error = gpgme_get_key(ctx, fp, &sender_key, 0);
|
||||||
|
if (error || sender_key == NULL) {
|
||||||
|
log_error("GPG: Failed to get sender_key. %s %s", gpgme_strsource(error), gpgme_strerror(error));
|
||||||
|
gpgme_release(ctx);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
keys[1] = sender_key;
|
||||||
|
|
||||||
gpgme_data_t plain;
|
gpgme_data_t plain;
|
||||||
gpgme_data_new_from_mem(&plain, message, strlen(message), 1);
|
gpgme_data_new_from_mem(&plain, message, strlen(message), 1);
|
||||||
@ -636,7 +644,8 @@ p_gpg_encrypt(const char *const barejid, const char *const message)
|
|||||||
error = gpgme_op_encrypt(ctx, keys, GPGME_ENCRYPT_ALWAYS_TRUST, plain, cipher);
|
error = gpgme_op_encrypt(ctx, keys, GPGME_ENCRYPT_ALWAYS_TRUST, plain, cipher);
|
||||||
gpgme_data_release(plain);
|
gpgme_data_release(plain);
|
||||||
gpgme_release(ctx);
|
gpgme_release(ctx);
|
||||||
gpgme_key_unref(key);
|
gpgme_key_unref(receiver_key);
|
||||||
|
gpgme_key_unref(sender_key);
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
log_error("GPG: Failed to encrypt message. %s %s", gpgme_strsource(error), gpgme_strerror(error));
|
log_error("GPG: Failed to encrypt message. %s %s", gpgme_strsource(error), gpgme_strerror(error));
|
||||||
@ -691,19 +700,29 @@ p_gpg_decrypt(const char *const cipher)
|
|||||||
|
|
||||||
gpgme_decrypt_result_t res = gpgme_op_decrypt_result(ctx);
|
gpgme_decrypt_result_t res = gpgme_op_decrypt_result(ctx);
|
||||||
if (res) {
|
if (res) {
|
||||||
|
GString *recipients_str = g_string_new("");
|
||||||
gpgme_recipient_t recipient = res->recipients;
|
gpgme_recipient_t recipient = res->recipients;
|
||||||
if (recipient) {
|
while (recipient) {
|
||||||
gpgme_key_t key;
|
gpgme_key_t key;
|
||||||
error = gpgme_get_key(ctx, recipient->keyid, &key, 1);
|
error = gpgme_get_key(ctx, recipient->keyid, &key, 1);
|
||||||
|
|
||||||
if (!error && key) {
|
if (!error && key) {
|
||||||
const char *addr = gpgme_key_get_string_attr(key, GPGME_ATTR_EMAIL, NULL, 0);
|
const char *addr = gpgme_key_get_string_attr(key, GPGME_ATTR_EMAIL, NULL, 0);
|
||||||
if (addr) {
|
if (addr) {
|
||||||
log_debug("GPG: Decrypted message for recipient: %s", addr);
|
g_string_append(recipients_str, addr);
|
||||||
}
|
}
|
||||||
gpgme_key_unref(key);
|
gpgme_key_unref(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (recipient->next) {
|
||||||
|
g_string_append(recipients_str, ", ");
|
||||||
|
}
|
||||||
|
|
||||||
|
recipient = recipient->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log_debug("GPG: Decrypted message for recipients: %s", recipients_str->str);
|
||||||
|
g_string_free(recipients_str, TRUE);
|
||||||
}
|
}
|
||||||
gpgme_release(ctx);
|
gpgme_release(ctx);
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@ gboolean p_gpg_available(const char *const barejid);
|
|||||||
const char* p_gpg_libver(void);
|
const char* p_gpg_libver(void);
|
||||||
char* p_gpg_sign(const char *const str, const char *const fp);
|
char* p_gpg_sign(const char *const str, const char *const fp);
|
||||||
void p_gpg_verify(const char *const barejid, const char *const sign);
|
void p_gpg_verify(const char *const barejid, const char *const sign);
|
||||||
char* p_gpg_encrypt(const char *const barejid, const char *const message);
|
char* p_gpg_encrypt(const char *const barejid, const char *const message, const char *const fp);
|
||||||
char* p_gpg_decrypt(const char *const cipher);
|
char* p_gpg_decrypt(const char *const cipher);
|
||||||
void p_gpg_free_decrypted(char *decrypted);
|
void p_gpg_free_decrypted(char *decrypted);
|
||||||
char* p_gpg_autocomplete_key(const char *const search_str);
|
char* p_gpg_autocomplete_key(const char *const search_str);
|
||||||
|
@ -163,7 +163,7 @@ message_send_chat_pgp(const char *const barejid, const char *const msg)
|
|||||||
ProfAccount *account = accounts_get_account(account_name);
|
ProfAccount *account = accounts_get_account(account_name);
|
||||||
if (account->pgp_keyid) {
|
if (account->pgp_keyid) {
|
||||||
Jid *jidp = jid_create(jid);
|
Jid *jidp = jid_create(jid);
|
||||||
char *encrypted = p_gpg_encrypt(jidp->barejid, msg);
|
char *encrypted = p_gpg_encrypt(jidp->barejid, msg, account->pgp_keyid);
|
||||||
if (encrypted) {
|
if (encrypted) {
|
||||||
message = stanza_create_message(ctx, id, jid, STANZA_TYPE_CHAT, "This message is encrypted.");
|
message = stanza_create_message(ctx, id, jid, STANZA_TYPE_CHAT, "This message is encrypted.");
|
||||||
xmpp_stanza_t *x = xmpp_stanza_new(ctx);
|
xmpp_stanza_t *x = xmpp_stanza_new(ctx);
|
||||||
|
Loading…
Reference in New Issue
Block a user