Commit 90a50ff1 authored by cypherpunk's avatar cypherpunk
Browse files

	* Conform to the new libotr API.
parent b502e7a9
2005-10-16
* Conform to the new libotr API.
2005-08-04
* otr-plugin.c: Disconnect all contexts when gaim is about to
......
24 Jun 2005:
- There are now three states a conversation can be in:
16 Oct 2005:
- There are now four states a conversation can be in:
* Not Private (not using OTR)
* Unverified (using OTR, but to a fingerprint that hasn't
been verified, so you are subject to a straightforward
active attack)
* Private (using OTR with a verified fingerprint)
* Finished (the other person has ended his side of the OTR
conversation, so we won't send any more messages at all
until we either end our side, or start a new OTR
conversatrion)
- There are new icons for these states that appear in the OTR button.
24 Jun 2005:
- Right-clicking the OTR button now produces an OTR menu, with options
to start or end the private conversation, verify the fingerprint, view
the secure session id, or get help.
......
......@@ -114,9 +114,9 @@ void otrg_dialog_private_key_wait_done(OtrgDialogWaitHandle handle)
/* Show a dialog informing the user that a correspondent (who) has sent
* us a Key Exchange Message (kem) that contains an unknown fingerprint. */
void otrg_dialog_unknown_fingerprint(OtrlUserState us, const char *accountname,
const char *protocol, const char *who, OTRKeyExchangeMsg kem)
const char *protocol, const char *who, unsigned char fingerprint[20])
{
ui_ops->unknown_fingerprint(us, accountname, protocol, who, kem);
ui_ops->unknown_fingerprint(us, accountname, protocol, who, fingerprint);
}
/* Show a dialog asking the user to verify the given fingerprint. */
......@@ -125,15 +125,13 @@ void otrg_dialog_verify_fingerprint(Fingerprint *fprint)
ui_ops->verify_fingerprint(fprint);
}
/* Call this when a context transitions from (a state other than
* CONN_CONNECTED) to CONN_CONNECTED. */
void otrg_dialog_connected(ConnContext *context)
/* Call this when a context transitions to ENCRYPTED. */
void otrg_dialog_connected(ConnContext *context, int protocol_version)
{
ui_ops->connected(context);
ui_ops->connected(context, protocol_version);
}
/* Call this when a context transitions from CONN_CONNECTED to
* (a state other than CONN_CONNECTED). */
/* Call this when a context transitions to PLAINTEXT. */
void otrg_dialog_disconnected(ConnContext *context)
{
ui_ops->disconnected(context);
......@@ -141,9 +139,17 @@ void otrg_dialog_disconnected(ConnContext *context)
/* Call this when we receive a Key Exchange message that doesn't cause
* our state to change (because it was just the keys we knew already). */
void otrg_dialog_stillconnected(ConnContext *context)
void otrg_dialog_stillconnected(ConnContext *context, int protocol_version)
{
ui_ops->stillconnected(context);
ui_ops->stillconnected(context, protocol_version);
}
/* Call this if the remote user terminates his end of an ENCRYPTED
* connection, and lets us know. */
void otrg_dialog_finished(const char *accountname, const char *protocol,
const char *username)
{
ui_ops->finished(accountname, protocol, username);
}
/* Set all OTR buttons to "sensitive" or "insensitive" as appropriate.
......
......@@ -50,15 +50,18 @@ typedef struct {
void (*private_key_wait_done)(OtrgDialogWaitHandle handle);
void (*unknown_fingerprint)(OtrlUserState us, const char *accountname,
const char *protocol, const char *who, OTRKeyExchangeMsg kem);
const char *protocol, const char *who, unsigned char fingerprint[20]);
void (*verify_fingerprint)(Fingerprint *fprint);
void (*connected)(ConnContext *context);
void (*connected)(ConnContext *context, int protocol_version);
void (*disconnected)(ConnContext *context);
void (*stillconnected)(ConnContext *context);
void (*stillconnected)(ConnContext *context, int protocol_version);
void (*finished)(const char *accountname, const char *protocol,
const char *username);
void (*resensitize_all)(void);
......@@ -113,22 +116,25 @@ void otrg_dialog_private_key_wait_done(OtrgDialogWaitHandle handle);
/* Show a dialog informing the user that a correspondent (who) has sent
* us a Key Exchange Message (kem) that contains an unknown fingerprint. */
void otrg_dialog_unknown_fingerprint(OtrlUserState us, const char *accountname,
const char *protocol, const char *who, OTRKeyExchangeMsg kem);
const char *protocol, const char *who, unsigned char fingerprint[20]);
/* Show a dialog asking the user to verify the given fingerprint. */
void otrg_dialog_verify_fingerprint(Fingerprint *fprint);
/* Call this when a context transitions from (a state other than
* CONN_CONNECTED) to CONN_CONNECTED. */
void otrg_dialog_connected(ConnContext *context);
/* Call this when a context transitions to ENCRYPTED. */
void otrg_dialog_connected(ConnContext *context, int protocol_version);
/* Call this when a context transitions from CONN_CONNECTED to
* (a state other than CONN_CONNECTED). */
/* Call this when a context transitions to PLAINTEXT. */
void otrg_dialog_disconnected(ConnContext *context);
/* Call this when we receive a Key Exchange message that doesn't cause
* our state to change (because it was just the keys we knew already). */
void otrg_dialog_stillconnected(ConnContext *context);
void otrg_dialog_stillconnected(ConnContext *context, int protocol_version);
/* Call this if the remote user terminates his end of an ENCRYPTED
* connection, and lets us know. */
void otrg_dialog_finished(const char *accountname, const char *protocol,
const char *username);
/* Set all OTR buttons to "sensitive" or "insensitive" as appropriate.
* Call this when accounts are logged in or out. */
......
......@@ -138,6 +138,37 @@ static const char * private_xpm[] = {
" .++++. ",
" .... "};
static const char * finished_xpm[] = {
"24 24 4 1",
" c None",
". c #000000",
"+ c #FF0000",
"@ c #FFFFFF",
" ...... ",
" ...++++++... ",
" .++++++++++++. ",
" .++++++++++++++. ",
" .++++++++++++++++. ",
" .++++++++++++++++++. ",
" .++++++++++++++++++++. ",
" .++++++++++++++++++++. ",
" .++++++++++++++++++++. ",
".++++++++++++++++++++++.",
".++@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@++.",
".++++++++++++++++++++++.",
" .++++++++++++++++++++. ",
" .++++++++++++++++++++. ",
" .++++++++++++++++++++. ",
" .++++++++++++++++++. ",
" .++++++++++++++++. ",
" .++++++++++++++. ",
" .++++++++++++. ",
" ...++++++... ",
" ...... "};
static GtkWidget *otr_icon(GtkWidget *image, TrustLevel level)
{
GdkPixbuf *pixbuf = NULL;
......@@ -153,6 +184,9 @@ static GtkWidget *otr_icon(GtkWidget *image, TrustLevel level)
case TRUST_PRIVATE:
data = private_xpm;
break;
case TRUST_FINISHED:
data = finished_xpm;
break;
}
pixbuf = gdk_pixbuf_new_from_xpm_data(data);
......@@ -418,13 +452,13 @@ static void add_unk_fingerprint_expander(GtkWidget *vbox, void *data)
* resp = -1. */
static void otrg_gtk_dialog_unknown_fingerprint(OtrlUserState us,
const char *accountname, const char *protocol, const char *who,
OTRKeyExchangeMsg kem)
unsigned char fingerprint[20])
{
char hash[45];
char *primary, *secondary;
GaimPlugin *p = gaim_find_prpl(protocol);
otrl_privkey_hash_to_human(hash, kem->key_fingerprint);
otrl_privkey_hash_to_human(hash, fingerprint);
primary = g_strdup_printf("%s (%s) has received an unknown fingerprint "
"from %s:", accountname,
(p && p->info->name) ? p->info->name : "Unknown", who);
......@@ -466,6 +500,7 @@ static void dialog_update_label_conv(GaimConversation *conv, TrustLevel level)
/* Set the button's icon, label and tooltip. */
otr_icon(icon, level);
gtk_label_set_text(GTK_LABEL(label),
level == TRUST_FINISHED ? "Finished" :
level == TRUST_PRIVATE ? "Private" :
level == TRUST_UNVERIFIED ? "Unverified" :
"Not private");
......@@ -546,19 +581,21 @@ static GtkWidget* otrg_gtk_dialog_view_sessionid(ConnContext *context)
"established.", context->username);
char *secondary;
int i;
SessionDirection dir = context->sessiondir;
OtrlSessionIdHalf whichhalf = context->sessionid_half;
size_t idhalflen = (context->sessionid_len) / 2;
/* Make a human-readable version of the sessionid (in two parts) */
sessionid = context->sessionid;
for(i=0;i<10;++i) sprintf(sess1+(2*i), "%02x", sessionid[i]);
sess1[20] = '\0';
for(i=0;i<10;++i) sprintf(sess2+(2*i), "%02x", sessionid[i+10]);
sess2[20] = '\0';
for(i=0;i<idhalflen;++i) sprintf(sess1+(2*i), "%02x", sessionid[i]);
for(i=0;i<idhalflen;++i) sprintf(sess2+(2*i), "%02x",
sessionid[i+idhalflen]);
secondary = g_strdup_printf("Secure session id:\n"
"<span %s>%s</span> <span %s>%s</span>\n",
dir == SESS_DIR_LOW ? "weight=\"bold\"" : "", sess1,
dir == SESS_DIR_HIGH ? "weight=\"bold\"" : "", sess2);
whichhalf == OTRL_SESSIONID_FIRST_HALF_BOLD ?
"weight=\"bold\"" : "", sess1,
whichhalf == OTRL_SESSIONID_SECOND_HALF_BOLD ?
"weight=\"bold\"" : "", sess2);
dialog = create_dialog(GAIM_NOTIFY_MSG_INFO, "Private connection "
"established", primary, secondary, 1, NULL,
......@@ -735,9 +772,9 @@ static void otrg_gtk_dialog_verify_fingerprint(Fingerprint *fprint)
g_free(secondary);
}
/* Call this when a context transitions from (a state other than
* CONN_CONNECTED) to CONN_CONNECTED. */
static void otrg_gtk_dialog_connected(ConnContext *context)
/* Call this when a context transitions to ENCRYPTED. */
static void otrg_gtk_dialog_connected(ConnContext *context,
int protocol_version)
{
GaimConversation *conv;
char *buf;
......@@ -746,14 +783,16 @@ static void otrg_gtk_dialog_connected(ConnContext *context)
conv = otrg_plugin_context_to_conv(context, 1);
level = otrg_plugin_context_to_trust(context);
buf = g_strdup_printf("%s conversation with %s started.",
buf = g_strdup_printf("%s conversation with %s started.%s",
level == TRUST_PRIVATE ? "Private" :
level == TRUST_UNVERIFIED ? "<a href=\"" UNVERIFIED_HELPURL
"\">Unverified</a>" :
/* This last case should never happen, since we know
* we're in CONN_CONNECTED. */
* we're in ENCRYPTED. */
"Not private",
gaim_conversation_get_name(conv));
gaim_conversation_get_name(conv),
protocol_version == 1 ? " Warning: using old protocol "
"version 1." : "");
gaim_conversation_write(conv, NULL, buf, GAIM_MESSAGE_SYSTEM, time(NULL));
g_free(buf);
......@@ -761,8 +800,7 @@ static void otrg_gtk_dialog_connected(ConnContext *context)
dialog_update_label(context);
}
/* Call this when a context transitions from CONN_CONNECTED to
* (a state other than CONN_CONNECTED). */
/* Call this when a context transitions to PLAINTEXT. */
static void otrg_gtk_dialog_disconnected(ConnContext *context)
{
GaimConversation *conv;
......@@ -778,9 +816,34 @@ static void otrg_gtk_dialog_disconnected(ConnContext *context)
dialog_update_label(context);
}
/* Call this if the remote user terminates his end of an ENCRYPTED
* connection, and lets us know. */
static void otrg_gtk_dialog_finished(const char *accountname,
const char *protocol, const char *username)
{
/* See if there's a conversation window we can put this in. */
GaimAccount *account;
GaimConversation *conv;
char *buf;
account = gaim_accounts_find(accountname, protocol);
if (!account) return;
conv = gaim_find_conversation_with_account(username, account);
if (!conv) return;
buf = g_strdup_printf("%s has ended his private conversation with you; "
"you should do the same.", gaim_conversation_get_name(conv));
gaim_conversation_write(conv, NULL, buf, GAIM_MESSAGE_SYSTEM, time(NULL));
g_free(buf);
dialog_update_label_conv(conv, TRUST_FINISHED);
}
/* Call this when we receive a Key Exchange message that doesn't cause
* our state to change (because it was just the keys we knew already). */
static void otrg_gtk_dialog_stillconnected(ConnContext *context)
static void otrg_gtk_dialog_stillconnected(ConnContext *context,
int protocol_version)
{
GaimConversation *conv;
char *buf;
......@@ -790,14 +853,16 @@ static void otrg_gtk_dialog_stillconnected(ConnContext *context)
level = otrg_plugin_context_to_trust(context);
buf = g_strdup_printf("Successfully refreshed the %s conversation "
"with %s.",
"with %s.%s",
level == TRUST_PRIVATE ? "private" :
level == TRUST_UNVERIFIED ? "<a href=\"" UNVERIFIED_HELPURL
"\">unverified</a>" :
/* This last case should never happen, since we know
* we're in CONN_CONNECTED. */
* we're in ENCRYPTED. */
"not private",
gaim_conversation_get_name(conv));
gaim_conversation_get_name(conv),
protocol_version == 1 ? " Warning: using old protocol "
"version 1." : "");
gaim_conversation_write(conv, NULL, buf, GAIM_MESSAGE_SYSTEM, time(NULL));
g_free(buf);
......@@ -830,7 +895,8 @@ static void view_sessionid(GtkWidget *widget, gpointer data)
GaimConversation *conv = data;
ConnContext *context = otrg_plugin_conv_to_context(conv);
if (context == NULL || context->state != CONN_CONNECTED) return;
if (context == NULL || context->msgstate != OTRL_MSGSTATE_ENCRYPTED)
return;
otrg_gtk_dialog_view_sessionid(context);
}
......@@ -840,7 +906,8 @@ static void verify_fingerprint(GtkWidget *widget, gpointer data)
GaimConversation *conv = data;
ConnContext *context = otrg_plugin_conv_to_context(conv);
if (context == NULL || context->state != CONN_CONNECTED) return;
if (context == NULL || context->msgstate != OTRL_MSGSTATE_ENCRYPTED)
return;
otrg_gtk_dialog_verify_fingerprint(context->active_fingerprint);
}
......@@ -1084,6 +1151,7 @@ static const OtrgDialogUiOps gtk_dialog_ui_ops = {
otrg_gtk_dialog_connected,
otrg_gtk_dialog_disconnected,
otrg_gtk_dialog_stillconnected,
otrg_gtk_dialog_finished,
otrg_gtk_dialog_resensitize_all,
otrg_gtk_dialog_new_conv,
otrg_gtk_dialog_remove_conv
......
......@@ -58,6 +58,13 @@ static struct {
struct otroptionsdata oo;
} ui_layout;
static const gchar *trust_states[] = {
"Not private",
"Unverified",
"Private",
"Finished"
};
static void account_menu_changed_cb(GtkWidget *item, GaimAccount *account,
void *data)
{
......@@ -170,12 +177,12 @@ static void otrg_gtk_ui_update_keylist(void)
* fingerprints list */
while(fingerprint) {
titles[0] = context->username;
if (context->state == CONN_CONNECTED &&
if (context->msgstate == OTRL_MSGSTATE_ENCRYPTED &&
context->active_fingerprint != fingerprint) {
titles[1] = "Unused";
} else {
titles[1] =
(gchar *) otrl_context_statestr[context->state];
titles[1] = (gchar *)
trust_states[otrg_plugin_context_to_trust(context)];
}
titles[2] = (fingerprint->trust && fingerprint->trust[0]) ?
"Yes" : "No";
......@@ -246,21 +253,21 @@ static void clist_selected(GtkWidget *widget, gint row, gint column,
int verify_sensitive = 0;
Fingerprint *f = gtk_clist_get_row_data(GTK_CLIST(ui_layout.keylist),
row);
if (f && f->context->state == CONN_CONNECTED &&
if (f && f->context->msgstate == OTRL_MSGSTATE_ENCRYPTED &&
f->context->active_fingerprint == f) {
disconnect_sensitive = 1;
}
if (f && f->context->state == CONN_SETUP) {
if (f && f->context->msgstate == OTRL_MSGSTATE_FINISHED) {
disconnect_sensitive = 1;
}
if (f && f->context->state == CONN_CONNECTED &&
f->context->active_fingerprint != f) {
if (f && (f->context->msgstate != OTRL_MSGSTATE_ENCRYPTED ||
f->context->active_fingerprint != f)) {
forget_sensitive = 1;
}
if (f && f->context->state == CONN_UNCONNECTED) {
forget_sensitive = 1;
if (f && f->context->msgstate == OTRL_MSGSTATE_PLAINTEXT) {
connect_sensitive = 1;
}
if (f && f->context->state == CONN_UNCONNECTED) {
if (f && f->context->msgstate == OTRL_MSGSTATE_FINISHED) {
connect_sensitive = 1;
}
if (f) {
......@@ -283,16 +290,23 @@ static void clist_unselected(GtkWidget *widget, gint row, gint column,
static int fngsortval(Fingerprint *f)
{
if (f->context->state == CONN_CONNECTED &&
f->context->active_fingerprint == f) {
return 0;
} else if (f->context->state == CONN_SETUP) {
return 1;
} else if (f->context->state == CONN_UNCONNECTED) {
return 2;
} else {
return 3;
int is_active = (f->context->msgstate == OTRL_MSGSTATE_ENCRYPTED &&
f->context->active_fingerprint == f);
TrustLevel level = otrg_plugin_context_to_trust(f->context);
switch(level) {
case TRUST_PRIVATE:
return is_active ? 0 : 100;
case TRUST_UNVERIFIED:
return is_active ? 1 : 100;
case TRUST_FINISHED:
return 2;
case TRUST_NOT_PRIVATE:
return 3;
}
/* Shouldn't get here, but anyway. */
return 200;
}
static gint statuscmp(GtkCList *clist, gconstpointer ptr1, gconstpointer ptr2)
......@@ -348,8 +362,8 @@ static void disconnect_connection(GtkWidget *widget, gpointer data)
if (context == NULL) return;
/* Don't do anything with fingerprints other than the active one
* if we're in the CONNECTED state */
if (context->state == CONN_CONNECTED &&
* if we're in the ENCRYPTED state */
if (context->msgstate == OTRL_MSGSTATE_ENCRYPTED &&
context->active_fingerprint != ui_layout.selected_fprint) {
return;
}
......
......@@ -211,9 +211,10 @@ static void update_context_list_cb(void *opdata)
static void confirm_fingerprint_cb(void *opdata, OtrlUserState us,
const char *accountname, const char *protocol, const char *username,
OTRKeyExchangeMsg kem)
unsigned char fingerprint[20])
{
otrg_dialog_unknown_fingerprint(us, accountname, protocol, username, kem);
otrg_dialog_unknown_fingerprint(us, accountname, protocol, username,
fingerprint);
}
static void write_fingerprints_cb(void *opdata)
......@@ -221,9 +222,10 @@ static void write_fingerprints_cb(void *opdata)
otrg_plugin_write_fingerprints();
}
static void gone_secure_cb(void *opdata, ConnContext *context)
static void gone_secure_cb(void *opdata, ConnContext *context,
int protocol_version)
{
otrg_dialog_connected(context);
otrg_dialog_connected(context, protocol_version);
}
static void gone_insecure_cb(void *opdata, ConnContext *context)
......@@ -231,10 +233,11 @@ static void gone_insecure_cb(void *opdata, ConnContext *context)
otrg_dialog_disconnected(context);
}
static void still_secure_cb(void *opdata, ConnContext *context, int is_reply)
static void still_secure_cb(void *opdata, ConnContext *context, int is_reply,
int protocol_version)
{
if (is_reply == 0) {
otrg_dialog_stillconnected(context);
otrg_dialog_stillconnected(context, protocol_version);
}
}
......@@ -300,11 +303,13 @@ static void process_sending_im(GaimAccount *account, char *who, char **message,
* context, from the given account. [account is actually a
* GaimAccount*, but it's declared here as void* so this can be passed
* as a callback.] */
void otrg_plugin_send_default_query(ConnContext *context, void *account)
void otrg_plugin_send_default_query(ConnContext *context, void *vaccount)
{
char *msg = otrl_proto_default_query_msg(context->accountname);
otrg_plugin_inject_message((GaimAccount *)account, context->username,
msg ? msg : "?OTR?");
GaimAccount *account = vaccount;
char *msg = otrl_proto_default_query_msg(context->accountname,
otrg_ui_find_policy(account, context->username));
otrg_plugin_inject_message(account, context->username,
msg ? msg : "?OTRv2?");
free(msg);
}
......@@ -320,8 +325,9 @@ void otrg_plugin_send_default_query_conv(GaimConversation *conv)
accountname = gaim_account_get_username(account);
username = gaim_conversation_get_name(conv);
msg = otrl_proto_default_query_msg(accountname);
otrg_plugin_inject_message(account, username, msg ? msg : "?OTR?");
msg = otrl_proto_default_query_msg(accountname,
otrg_ui_find_policy(account, username));
otrg_plugin_inject_message(account, username, msg ? msg : "?OTRv2?");
free(msg);
}
......@@ -360,15 +366,8 @@ static gboolean process_receiving_im(GaimAccount *account, char **who,
tlv = otrl_tlv_find(tlvs, OTRL_TLV_DISCONNECTED);
if (tlv) {
/* Notify the user that the other side disconnected. */
char *msg = g_strdup_printf("OTR: %s has closed his private "
"connection to you; you should do the same.", username);
if (msg) {
otrg_dialog_display_otr_message(accountname, protocol,
username, msg);
g_free(msg);
}
otrg_dialog_finished(accountname, protocol, username);
otrg_ui_update_keylist();
}
otrl_tlv_free(tlvs);
......@@ -498,13 +497,15 @@ TrustLevel otrg_plugin_context_to_trust(ConnContext *context)
{
TrustLevel level = TRUST_NOT_PRIVATE;
if (context && context->state == CONN_CONNECTED) {
if (context && context->msgstate == OTRL_MSGSTATE_ENCRYPTED) {
if (context->active_fingerprint->trust &&
context->active_fingerprint->trust[0] != '\0') {
level = TRUST_PRIVATE;
} else {
level = TRUST_UNVERIFIED;
}
} else if (context && context->msgstate == OTRL_MSGSTATE_FINISHED) {
level = TRUST_FINISHED;
}
return level;
......
......@@ -72,7 +72,8 @@ GaimConversation *otrg_plugin_context_to_conv(ConnContext *context,
typedef enum {
TRUST_NOT_PRIVATE,
TRUST_UNVERIFIED,
TRUST_PRIVATE
TRUST_PRIVATE,
TRUST_FINISHED
} TrustLevel;
/* What level of trust do we have in the privacy of this ConnContext? */
......
......@@ -72,8 +72,9 @@ void otrg_ui_connect_connection(ConnContext *context)
GaimAccount *account;
char *msg;
/* Only do anything for UNCONNECTED fingerprints */
if (context == NULL || context->state != CONN_UNCONNECTED) return;
/* Don't do this if we're already ENCRYPTED */
if (context == NULL || context->msgstate == OTRL_MSGSTATE_ENCRYPTED)
return;
account = gaim_accounts_find(context->accountname, context->protocol);
if (!account) {
......@@ -89,11 +90,12 @@ void otrg_ui_connect_connection(ConnContext *context)
otrg_plugin_send_default_query(context, account);
}
/* Drop a context to UNCONNECTED state */
/* Drop a context to PLAINTEXT state */
void otrg_ui_disconnect_connection(ConnContext *context)
{
/* Don't do anything with UNCONNECTED fingerprints */
if (context == NULL || context->state == CONN_UNCONNECTED) return;
/* Don't do anything with PLAINTEXT fingerprints */
if (context == NULL || context->msgstate == OTRL_MSGSTATE_PLAINTEXT)
return;
otrg_plugin_disconnect(context);
otrg_dialog_disconnected(context);
......@@ -107,9 +109,9 @@ void otrg_ui_forget_fingerprint(Fingerprint *fingerprint)
if (fingerprint == NULL) return;
/* Don't do anything with the active fingerprint if we're in the
* CONNECTED state. */
* ENCRYPTED state. */
context = fingerprint->context;
if (context->state == CONN_CONNECTED &&
if (context->msgstate == OTRL_MSGSTATE_ENCRYPTED &&
context->active_fingerprint == fingerprint) return;
otrl_context_forget_fingerprint(fingerprint, 1);
......
......@@ -48,7 +48,7 @@ void otrg_ui_update_keylist(void);
/* Send an OTR Query Message to attempt to start a connection */
void otrg_ui_connect_connection(ConnContext *context);
/* Drop a context to UNCONNECTED state */
/* Drop a context to PLAINTEXT state */
void otrg_ui_disconnect_connection(ConnContext *context);
/* Forget a fingerprint */
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment