Hi all:Attached is a simple patch against svn rev. 7953 which lets you explicitly specify a key id for an identity, instead of letting Balsa choose a key. In the text entry, enter the 8-digit hex id of the key which shall be used. If the entry is empty, Balsa will automagically choose the proper key for the identity (mail address), or display a dialogue to choose one if more are available. Any comments are of course welcome!
Am 02.08.08 16:00 schrieb(en) Bruno Miguel:
> be improved, though. If you have any ideas, they would be welcome!The ability to create signing filters, so a specific email address would be automatically signed with a specific key, also allowing the sender to remove the signature if he wanted.
Well, I thought more about dealing with the GnuPG trust data, see <http://www.dewinter.com/gnupg_howto/english/GPGMiniHowto-1.html#ss1.3>. IMHO, the information you are referring to goes beyond the scope of Balsa and would better be stored in an address book or a similar data base. It could contain the following information for each person:
* shall receive signed messages - yes/no - use key with ID xxx (optional) * shall receive encrypted messages - yes/no - use key with ID yyy (optional) * use protocol: RFC 2440/2633/3156 * (maybe more could be usefu8l, like default language etc.)However, dealing with this information is not so easy - what should Balsa do if you send a message to multiple recipients with contradictory statements?
And now, when you send a message, you always get a dialogue to choose the key, right?I haven't tried that, yet. But I will do it in a moment.
May be superseded by the patch above...
I hope Balsa's community doesn't think I'm trying to force anything. I'm just suggesting features I would like to see in Balsa and I consider useful to other people. Unfortunately for me, I never learned how to code, so I can't send patches; only make suggestions, send debugs, etc.
Any feedback from users is always very welcome! It just sometimes needs some discussion before I completely understand /what/ you want... ;-) (and of course you have to find someone who thinks it really adds value to Balsa, and who codes it).
Cheers, Albrecht.
Index: src/sendmsg-window.c =================================================================== --- src/sendmsg-window.c (Revision 7953) +++ src/sendmsg-window.c (Arbeitskopie) @@ -5593,6 +5593,8 @@ (bsmsg->gpg_mode & LIBBALSA_PROTECT_MODE) != 0 ? bsmsg->gpg_mode : 0; else message->gpg_mode = 0; + if (ident->force_key_id && *ident->force_key_id) + message->force_key_id = strdup(ident->force_key_id); #endif /* remember the parent window */ Index: doc/C/balsa.xml =================================================================== --- doc/C/balsa.xml (Revision 7953) +++ doc/C/balsa.xml (Arbeitskopie) @@ -4044,6 +4044,19 @@ </listitem> </varlistentry> + <varlistentry> + <term><guilabel>Use secret key with this id for signing.</guilabel></term> + <listitem> + <para> + Usually, &Balsa; automaticylly selects a proper secret key for cryptographic + signatures from the identity's mail address. Therefore, most users should + leave this entry empty. If you want to force using a specific secret key for + cryptographic signatures, enter the key id here. You can get the key id by + running the command 'gpg --list-secret-keys'. + </para> + </listitem> + </varlistentry> + </variablelist> <note> Index: libbalsa/identity.h =================================================================== --- libbalsa/identity.h (Revision 7953) +++ libbalsa/identity.h (Arbeitskopie) @@ -87,6 +87,7 @@ gboolean always_trust; gboolean warn_send_plain; gint crypt_protocol; + gchar *force_key_id; #endif #if ENABLE_ESMTP LibBalsaSmtpServer *smtp_server; Index: libbalsa/gmime-gpgme-context.c =================================================================== --- libbalsa/gmime-gpgme-context.c (Revision 7953) +++ libbalsa/gmime-gpgme-context.c (Arbeitskopie) @@ -860,14 +860,25 @@ if (!keys) { if (error) { - if (found_bad) - g_set_error(error, GPGME_ERROR_QUARK, GPG_ERR_KEY_SELECTION, - _("%s: a key for %s is present, but it is expired, disabled, revoked or invalid"), - "gmime-gpgme", name); - else - g_set_error(error, GPGME_ERROR_QUARK, GPG_ERR_KEY_SELECTION, - _("%s: could not find a key for %s"), - "gmime-gpgme", name); + if (strchr(name, '@')) { + if (found_bad) + g_set_error(error, GPGME_ERROR_QUARK, GPG_ERR_KEY_SELECTION, + _("%s: a key for %s is present, but it is expired, disabled, revoked or invalid"), + "gmime-gpgme", name); + else + g_set_error(error, GPGME_ERROR_QUARK, GPG_ERR_KEY_SELECTION, + _("%s: could not find a key for %s"), + "gmime-gpgme", name); + } else { + if (found_bad) + g_set_error(error, GPGME_ERROR_QUARK, GPG_ERR_KEY_SELECTION, + _("%s: a key with id %s is present, but it is expired, disabled, revoked or invalid"), + "gmime-gpgme", name); + else + g_set_error(error, GPGME_ERROR_QUARK, GPG_ERR_KEY_SELECTION, + _("%s: could not find a key with id %s"), + "gmime-gpgme", name); + } } return NULL; } Index: libbalsa/message.c =================================================================== --- libbalsa/message.c (Revision 7953) +++ libbalsa/message.c (Arbeitskopie) @@ -101,6 +101,7 @@ message->has_all_headers = 0; #ifdef HAVE_GPGME message->prot_state = LIBBALSA_MSG_PROTECT_NONE; + message->force_key_id = NULL; #endif } @@ -177,6 +178,11 @@ g_object_unref(message->mime_msg); message->mime_msg = NULL; } + +#ifdef HAVE_GPGME + g_free(message->force_key_id); +#endif + G_OBJECT_CLASS(parent_class)->finalize(object); } Index: libbalsa/message.h =================================================================== --- libbalsa/message.h (Revision 7953) +++ libbalsa/message.h (Arbeitskopie) @@ -207,6 +207,9 @@ /* protection (i.e. sign/encrypt) status (received message) */ LibBalsaMsgProtectState prot_state; + + /* forced id of the senders secret key, empty to choose it from the mail address */ + gchar * force_key_id; #endif /* a forced multipart subtype or NULL for mixed; used only for Index: libbalsa/send.c =================================================================== --- libbalsa/send.c (Revision 7953) +++ libbalsa/send.c (Arbeitskopie) @@ -2042,6 +2042,9 @@ lb_send_from(LibBalsaMessage *message) { InternetAddress *ia = message->headers->from->address; + + if (message->force_key_id) + return message->force_key_id; if (ia->type == INTERNET_ADDRESS_NONE) return NULL; Index: libbalsa/identity.c =================================================================== --- libbalsa/identity.c (Revision 7953) +++ libbalsa/identity.c (Arbeitskopie) @@ -116,6 +116,7 @@ ident->always_trust = FALSE; ident->warn_send_plain = TRUE; ident->crypt_protocol = LIBBALSA_PROTECT_OPENPGP; + ident->force_key_id = NULL; #endif ident->request_mdn = FALSE; /* @@ -146,6 +147,9 @@ #endif /* ENABLE_ESMTP */ g_free(ident->face); g_free(ident->x_face); +#ifdef HAVE_GPGME + g_free(ident->force_key_id); +#endif G_OBJECT_CLASS(parent_class)->finalize(object); } @@ -1067,6 +1071,9 @@ ident_dialog_add_checkbutton(table, row++, dialog, _("remind me if messages can be encrypted"), "identity-warn-send-plain", TRUE); + ident_dialog_add_entry(table, row++, dialog, + _("use secret key with this id for signing\n(leave empty for automatic selection)"), + "identity-keyid"); #ifndef HAVE_GPGME gtk_widget_set_sensitive(table, FALSE); #endif @@ -1511,6 +1518,7 @@ id->warn_send_plain = ident_dialog_get_bool(dlg, "identity-warn-send-plain"); id->crypt_protocol = GPOINTER_TO_INT(ident_dialog_get_value (dlg, "identity-crypt-protocol")); + id->force_key_id = g_strstrip(ident_dialog_get_text(dlg, "identity-keyid")); #endif return TRUE; @@ -1895,6 +1903,7 @@ ident->warn_send_plain); display_frame_set_gpg_mode(dialog, "identity-crypt-protocol", &ident->crypt_protocol); + display_frame_set_field(dialog, "identity-keyid", ident->force_key_id); #endif } @@ -1997,6 +2006,7 @@ ident->always_trust = libbalsa_conf_get_bool("GpgTrustAlways"); ident->warn_send_plain = libbalsa_conf_get_bool("GpgWarnSendPlain=true"); ident->crypt_protocol = libbalsa_conf_get_int("CryptProtocol=16"); + ident->force_key_id = libbalsa_conf_get_string("ForceKeyID"); #endif return ident; @@ -2044,6 +2054,7 @@ libbalsa_conf_set_bool("GpgTrustAlways", ident->always_trust); libbalsa_conf_set_bool("GpgWarnSendPlain", ident->warn_send_plain); libbalsa_conf_set_int("CryptProtocol", ident->crypt_protocol); + libbalsa_conf_set_string("ForceKeyID", ident->force_key_id); #endif libbalsa_conf_pop_group();
Attachment:
pgpZNF5iDVf4a.pgp
Description: PGP signature