mirror of
https://github.com/djcb/mu.git
synced 2024-06-26 07:29:17 +02:00
* crypto: add mu_msg_crypto_decrypt_part, fix password func, remove cruft
This commit is contained in:
parent
d68dcbfc86
commit
c88aea5285
|
@ -52,12 +52,16 @@ password_requester (GMimeCryptoContext *ctx, const char *user_id,
|
||||||
ssize_t written;
|
ssize_t written;
|
||||||
|
|
||||||
cbdata = g_object_get_data (G_OBJECT(ctx), CALLBACK_DATA);
|
cbdata = g_object_get_data (G_OBJECT(ctx), CALLBACK_DATA);
|
||||||
g_return_val_if_fail (cbdata, FALSE);
|
if (!cbdata || !cbdata->pw_func)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
password = cbdata->pw_func (user_id, prompt_ctx, reprompt,
|
password = cbdata->pw_func (user_id, prompt_ctx, reprompt,
|
||||||
cbdata->user_data);
|
cbdata->user_data);
|
||||||
if (!password)
|
if (!password) {
|
||||||
|
mu_util_g_set_error (err, MU_ERROR_CRYPTO,
|
||||||
|
"failed to get password");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
written = g_mime_stream_write_string (response, password);
|
written = g_mime_stream_write_string (response, password);
|
||||||
if (written != -1)
|
if (written != -1)
|
||||||
|
@ -67,7 +71,7 @@ password_requester (GMimeCryptoContext *ctx, const char *user_id,
|
||||||
"writing password to mime stream failed");
|
"writing password to mime stream failed");
|
||||||
|
|
||||||
if (g_mime_stream_flush (response) != 0)
|
if (g_mime_stream_flush (response) != 0)
|
||||||
g_printerr ("error flushing stream!\n");
|
g_printerr ("error flushing stream\n");
|
||||||
|
|
||||||
memset (password, 0, strlen(password));
|
memset (password, 0, strlen(password));
|
||||||
g_free (password);
|
g_free (password);
|
||||||
|
@ -114,8 +118,11 @@ get_gpg_crypto_context (MuMsgOptions opts, GError **err)
|
||||||
}
|
}
|
||||||
|
|
||||||
g_mime_gpg_context_set_use_agent
|
g_mime_gpg_context_set_use_agent
|
||||||
(GMIME_GPG_CONTEXT(cctx),
|
(GMIME_GPG_CONTEXT(cctx), TRUE);
|
||||||
opts & MU_MSG_OPTION_USE_AGENT ? TRUE:FALSE);
|
/* opts & MU_MSG_OPTION_USE_AGENT ? TRUE:FALSE); */
|
||||||
|
/* g_mime_gpg_context_set_use_agent */
|
||||||
|
/* (GMIME_GPG_CONTEXT(cctx), */
|
||||||
|
/* opts & MU_MSG_OPTION_USE_AGENT ? TRUE:FALSE); */
|
||||||
g_mime_gpg_context_set_auto_key_retrieve
|
g_mime_gpg_context_set_auto_key_retrieve
|
||||||
(GMIME_GPG_CONTEXT(cctx),
|
(GMIME_GPG_CONTEXT(cctx),
|
||||||
opts & MU_MSG_OPTION_AUTO_RETRIEVE_KEY ? TRUE:FALSE);
|
opts & MU_MSG_OPTION_AUTO_RETRIEVE_KEY ? TRUE:FALSE);
|
||||||
|
@ -523,118 +530,30 @@ mu_msg_part_sig_info_to_string (MuMsgPartSigInfo *info)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct _MuMsgDecryptedPart {
|
GMimeObject* /* this is declared in mu-msg-priv.h */
|
||||||
GMimeObject *decrypted;
|
mu_msg_crypto_decrypt_part (GMimeMultipartEncrypted *enc, MuMsgOptions opts,
|
||||||
};
|
GError **err)
|
||||||
|
|
||||||
|
|
||||||
struct _PartData {
|
|
||||||
MuMsgPartDecryptForeachFunc func;
|
|
||||||
gpointer user_data;
|
|
||||||
GMimeCryptoContext *cctx;
|
|
||||||
GError *err;
|
|
||||||
};
|
|
||||||
typedef struct _PartData PartData;
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
each_encpart (GMimeObject *parent, GMimeObject *part, PartData *pdata)
|
|
||||||
{
|
{
|
||||||
MuMsgDecryptedPart dpart;
|
GMimeObject *dec;
|
||||||
|
GMimeCryptoContext *ctx;
|
||||||
|
|
||||||
if (pdata->err)
|
g_return_val_if_fail (GMIME_IS_MULTIPART_ENCRYPTED(enc), NULL);
|
||||||
return;
|
|
||||||
|
|
||||||
if (!GMIME_IS_MULTIPART_ENCRYPTED (part))
|
ctx = get_crypto_context (opts, NULL, NULL, err);
|
||||||
return; /* nothing to do for this part */
|
if (!ctx) {
|
||||||
|
|
||||||
dpart.decrypted =
|
|
||||||
g_mime_multipart_encrypted_decrypt (
|
|
||||||
GMIME_MULTIPART_ENCRYPTED(part),
|
|
||||||
pdata->cctx, NULL, &pdata->err);
|
|
||||||
if (!dpart.decrypted || pdata->err) {
|
|
||||||
if (!pdata->err)
|
|
||||||
mu_util_g_set_error
|
|
||||||
(&pdata->err,
|
|
||||||
MU_ERROR_CRYPTO,
|
|
||||||
"decryption failed");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
pdata->func (&dpart, pdata->user_data);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
mu_msg_part_decrypt_foreach (MuMsg *msg, MuMsgPartDecryptForeachFunc func,
|
|
||||||
MuMsgPartPasswordFunc password_func,
|
|
||||||
gpointer user_data, MuMsgOptions opts, GError **err)
|
|
||||||
{
|
|
||||||
PartData pdata;
|
|
||||||
|
|
||||||
g_return_val_if_fail (msg, FALSE);
|
|
||||||
g_return_val_if_fail (func, FALSE);
|
|
||||||
g_return_val_if_fail (password_func, FALSE);
|
|
||||||
|
|
||||||
if (!mu_msg_load_msg_file (msg, err))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
pdata.func = func;
|
|
||||||
pdata.user_data = user_data;
|
|
||||||
pdata.err = NULL;
|
|
||||||
pdata.cctx = get_crypto_context (opts, password_func,
|
|
||||||
user_data, err);
|
|
||||||
if (!pdata.cctx)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
g_mime_message_foreach (msg->_file->_mime_msg,
|
|
||||||
(GMimeObjectForeachFunc)each_encpart,
|
|
||||||
&pdata);
|
|
||||||
if (pdata.err) {
|
|
||||||
*err = pdata.err;
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_object_unref (pdata.cctx);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
char*
|
|
||||||
mu_msg_decrypted_part_to_string (MuMsgDecryptedPart *dpart, GError **err)
|
|
||||||
{
|
|
||||||
GMimePart *part;
|
|
||||||
gboolean not_ok;
|
|
||||||
gchar *str;
|
|
||||||
|
|
||||||
g_return_val_if_fail (dpart, NULL);
|
|
||||||
|
|
||||||
if (!GMIME_IS_PART(dpart->decrypted)) {
|
|
||||||
mu_util_g_set_error (err, MU_ERROR_CRYPTO,
|
mu_util_g_set_error (err, MU_ERROR_CRYPTO,
|
||||||
"wrong mime-type");
|
"failed to get crypto context");
|
||||||
return NULL; /* can only convert parts to string*/
|
|
||||||
}
|
|
||||||
part = GMIME_PART(dpart->decrypted);
|
|
||||||
str = mu_msg_mime_part_to_string (part, ¬_ok);
|
|
||||||
|
|
||||||
if (not_ok) {
|
|
||||||
g_free (str);
|
|
||||||
mu_util_g_set_error (err, MU_ERROR_CRYPTO,
|
|
||||||
"failed to convert part to string");
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return str;
|
dec = g_mime_multipart_encrypted_decrypt (enc, ctx, NULL, err);
|
||||||
}
|
g_object_unref (ctx);
|
||||||
|
if (!dec) {
|
||||||
|
if (err && !*err)
|
||||||
gboolean
|
mu_util_g_set_error (err, MU_ERROR_CRYPTO,
|
||||||
mu_msg_decrypted_part_to_file (MuMsgDecryptedPart *dpart, const char *path,
|
"decryption failed");
|
||||||
GError **err)
|
return NULL;
|
||||||
{
|
}
|
||||||
g_return_val_if_fail (dpart, FALSE);
|
|
||||||
g_return_val_if_fail (path, FALSE);
|
return dec;
|
||||||
|
|
||||||
return mu_msg_part_mime_save_object (dpart->decrypted, path, FALSE, FALSE,
|
|
||||||
err);
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user