aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/user-guide/commands.xml15
-rw-r--r--otr.c25
2 files changed, 39 insertions, 1 deletions
diff --git a/doc/user-guide/commands.xml b/doc/user-guide/commands.xml
index 2d6b866d..8c2a30ca 100644
--- a/doc/user-guide/commands.xml
+++ b/doc/user-guide/commands.xml
@@ -345,7 +345,7 @@
<description>
<para>
- Forgets some part of our OTR userstate. Available things: fingerprint and context. See <emphasis>help otr forget &lt;thing&gt;</emphasis> for more information.
+ Forgets some part of our OTR userstate. Available things: fingerprint, context, and key. See <emphasis>help otr forget &lt;thing&gt;</emphasis> for more information.
</para>
</description>
@@ -376,6 +376,19 @@
</bitlbee-command>
+ <bitlbee-command name="key">
+ <syntax>otr forget key &lt;fingerprint&gt;</syntax>
+
+ <description>
+
+ <para>
+ Forgets an OTR private key matching the specified fingerprint. It is allowed to specify only a (unique) prefix of the fingerprint.
+ </para>
+
+ </description>
+
+ </bitlbee-command>
+
</bitlbee-command>
</bitlbee-command>
diff --git a/otr.c b/otr.c
index 4d465e71..d69dffaf 100644
--- a/otr.c
+++ b/otr.c
@@ -126,6 +126,7 @@ void myfgets(char *s, int size, FILE *stream);
void yes_keygen(gpointer w, void *data);
void yes_forget_fingerprint(gpointer w, void *data);
void yes_forget_context(gpointer w, void *data);
+void yes_forget_key(gpointer w, void *data);
/* helper to make sure accountname and protocol match the incoming "opdata" */
struct im_connection *check_imc(void *opdata, const char *accountname,
@@ -898,6 +899,13 @@ void yes_forget_context(gpointer w, void *data)
otrl_context_forget(ctx);
}
+void yes_forget_key(gpointer w, void *data)
+{
+ OtrlPrivKey *key = (OtrlPrivKey *)data;
+
+ otrl_privkey_forget(key);
+}
+
void cmd_otr_forget(irc_t *irc, char **args)
{
if(!strcmp(args[1], "fingerprint"))
@@ -974,6 +982,23 @@ void cmd_otr_forget(irc_t *irc, char **args)
g_free(s);
}
+ else if(!strcmp(args[1], "key"))
+ {
+ OtrlPrivKey *key;
+ char *s;
+
+ key = match_privkey(irc, ((const char **)args)+2);
+ if(!key) {
+ /* match_privkey does error messages */
+ return;
+ }
+
+ s = g_strdup_printf("about to forget the private key for %s/%s, are you sure?",
+ key->accountname, key->protocol);
+ query_add(irc, NULL, s, yes_forget_key, NULL, key);
+ g_free(s);
+ }
+
else
{
irc_usermsg(irc, "otr %s: unknown subcommand \"%s\", see \x02help otr forget\x02",