1
0
mirror of https://github.com/profanity-im/profanity.git synced 2024-11-03 19:37:16 -05:00

Require '/otr start' from both parties before encryption used both ways

This commit is contained in:
James Booth 2014-01-11 17:03:01 +00:00
parent 5c13538e6b
commit 9daefe170d
9 changed files with 114 additions and 18 deletions

View File

@ -1140,10 +1140,24 @@ cmd_execute_default(const char * const inp)
ui_current_print_line("You are not currently connected.");
} else {
#ifdef HAVE_LIBOTR
char *encrypted = otr_encrypt_message(recipient, inp);
if (encrypted != NULL) {
message_send(encrypted, recipient);
otr_free_message(encrypted);
if (ui_current_win_is_otr()) {
char *encrypted = otr_encrypt_message(recipient, inp);
if (encrypted != NULL) {
message_send(encrypted, recipient);
otr_free_message(encrypted);
if (prefs_get_boolean(PREF_CHLOG)) {
const char *jid = jabber_get_fulljid();
Jid *jidp = jid_create(jid);
chat_log_chat(jidp->barejid, recipient, inp, PROF_OUT_LOG, NULL);
jid_destroy(jidp);
}
ui_outgoing_msg("me", recipient, inp);
} else {
cons_show_error("Failed to send message.");
}
} else {
message_send(inp, recipient);
if (prefs_get_boolean(PREF_CHLOG)) {
const char *jid = jabber_get_fulljid();
Jid *jidp = jid_create(jid);
@ -1152,8 +1166,6 @@ cmd_execute_default(const char * const inp)
}
ui_outgoing_msg("me", recipient, inp);
} else {
cons_show_error("Failed to send message.");
}
#else
message_send(inp, recipient);
@ -1166,7 +1178,6 @@ cmd_execute_default(const char * const inp)
ui_outgoing_msg("me", recipient, inp);
#endif
}
break;

View File

@ -42,6 +42,8 @@
#include "tools/parser.h"
#include "tools/tinyurl.h"
#include "ui/ui.h"
#include "ui/window.h"
#include "ui/windows.h"
#include "xmpp/xmpp.h"
#include "xmpp/bookmark.h"
@ -917,10 +919,24 @@ cmd_msg(gchar **args, struct cmd_help_t help)
}
if (msg != NULL) {
#ifdef HAVE_LIBOTR
char *encrypted = otr_encrypt_message(usr_jid, msg);
if (encrypted != NULL) {
message_send(encrypted, usr_jid);
otr_free_message(encrypted);
if (ui_current_win_is_otr()) {
char *encrypted = otr_encrypt_message(usr_jid, msg);
if (encrypted != NULL) {
message_send(encrypted, usr_jid);
otr_free_message(encrypted);
ui_outgoing_msg("me", usr_jid, msg);
if (((win_type == WIN_CHAT) || (win_type == WIN_CONSOLE)) && prefs_get_boolean(PREF_CHLOG)) {
const char *jid = jabber_get_fulljid();
Jid *jidp = jid_create(jid);
chat_log_chat(jidp->barejid, usr_jid, msg, PROF_OUT_LOG, NULL);
jid_destroy(jidp);
}
} else {
cons_show_error("Failed to encrypt and send message,");
}
} else {
message_send(msg, usr_jid);
ui_outgoing_msg("me", usr_jid, msg);
if (((win_type == WIN_CHAT) || (win_type == WIN_CONSOLE)) && prefs_get_boolean(PREF_CHLOG)) {
@ -929,10 +945,8 @@ cmd_msg(gchar **args, struct cmd_help_t help)
chat_log_chat(jidp->barejid, usr_jid, msg, PROF_OUT_LOG, NULL);
jid_destroy(jidp);
}
} else {
cons_show_error("Failed to send message,");
}
return TRUE;
#else
message_send(msg, usr_jid);
ui_outgoing_msg("me", usr_jid, msg);
@ -942,9 +956,10 @@ cmd_msg(gchar **args, struct cmd_help_t help)
Jid *jidp = jid_create(jid);
chat_log_chat(jidp->barejid, usr_jid, msg, PROF_OUT_LOG, NULL);
jid_destroy(jidp);
}
return TRUE;
#endif
return TRUE;
} else {
const char * jid = NULL;
@ -2300,6 +2315,22 @@ cmd_otr(gchar **args, struct cmd_help_t help)
char *fingerprint = otr_get_fingerprint();
cons_show("Your fingerprint: %s", fingerprint);
return TRUE;
} else if (strcmp(args[0], "start") == 0) {
win_type_t win_type = ui_current_win_type();
if (win_type != WIN_CHAT) {
ui_current_print_line("You must be in a regular chat window to start an OTR session.");
} else if (ui_current_win_is_otr()) {
ui_current_print_line("You are already in an OTR session.");
} else {
if (!otr_key_loaded()) {
ui_current_print_line("You have not generated or loaded a private key, use '/otr gen'");
} else {
ui_current_print_line("Starting OTR session");
ui_current_set_otr(TRUE);
}
}
return TRUE;
} else {
cons_show("Usage: %s", help.usage);
return TRUE;

View File

@ -301,6 +301,7 @@ otr_keygen(ProfAccount *account)
g_string_free(basedir, TRUE);
g_string_free(keysfilename, TRUE);
log_error("Failed to load private key");
data_loaded = FALSE;
return;
}
@ -309,15 +310,24 @@ otr_keygen(ProfAccount *account)
g_string_free(basedir, TRUE);
g_string_free(keysfilename, TRUE);
log_error("Failed to load fingerprints");
data_loaded = FALSE;
return;
}
data_loaded = TRUE;
g_string_free(basedir, TRUE);
g_string_free(keysfilename, TRUE);
g_string_free(fpsfilename, TRUE);
return;
}
gboolean
otr_key_loaded(void)
{
return data_loaded;
}
char *
otr_get_fingerprint(void)
{
@ -361,12 +371,20 @@ otr_decrypt_message(const char * const from, const char * const message)
{
cons_debug("Decrypting message: %s", message);
char *decrypted = NULL;
int ignore_mesage = otrl_message_receiving(user_state, &ops, NULL, jid, "xmpp", from, message, &decrypted, 0, NULL, NULL);
if (!ignore_mesage) {
int result = otrl_message_receiving(user_state, &ops, NULL, jid, "xmpp", from, message, &decrypted, 0, NULL, NULL);
// internal libotr message, ignore
if (result == 1) {
return NULL;
// message was decrypted, return to user
} else if (decrypted != NULL) {
cons_debug("Decrypted message: %s", decrypted);
return decrypted;
// normal non OTR message
} else {
return NULL;
return strdup(message);
}
}

View File

@ -29,6 +29,8 @@ void otr_init(void);
void otr_on_connect(ProfAccount *account);
void otr_keygen(ProfAccount *account);
gboolean otr_key_loaded(void);
char * otr_get_fingerprint(void);
char * otr_encrypt_message(const char * const to, const char * const message);

View File

@ -171,6 +171,7 @@ handle_duck_result(const char * const result)
void
handle_incoming_message(char *from, char *message, gboolean priv)
{
#ifdef HAVE_LIBOTR
char *newmessage;
if (!priv) {
newmessage = otr_decrypt_message(from, message);
@ -195,6 +196,19 @@ handle_incoming_message(char *from, char *message, gboolean priv)
if (!priv)
otr_free_message(newmessage);
#else
ui_incoming_msg(from, message, NULL, priv);
ui_current_page_off();
if (prefs_get_boolean(PREF_CHLOG) && !priv) {
Jid *from_jid = jid_create(from);
const char *jid = jabber_get_fulljid();
Jid *jidp = jid_create(jid);
chat_log_chat(jidp->barejid, from_jid->barejid, message, PROF_IN_LOG, NULL);
jid_destroy(jidp);
jid_destroy(from_jid);
}
#endif
}
void

View File

@ -693,6 +693,20 @@ _ui_current_win_type(void)
return current->type;
}
static gboolean
_ui_current_win_is_otr(void)
{
ProfWin *current = wins_get_current();
return current->is_otr;
}
static void
_ui_current_set_otr(gboolean value)
{
ProfWin *current = wins_get_current();
current->is_otr = value;
}
static int
_ui_current_win_index(void)
{
@ -1609,4 +1623,6 @@ ui_init_module(void)
ui_unread = _ui_unread;
ui_win_unread = _ui_win_unread;
ui_ask_password = _ui_ask_password;
ui_current_win_is_otr = _ui_current_win_is_otr;
ui_current_set_otr = _ui_current_set_otr;
}

View File

@ -77,6 +77,8 @@ void (*ui_close_current)(void);
void (*ui_clear_current)(void);
win_type_t (*ui_current_win_type)(void);
int (*ui_current_win_index)(void);
gboolean (*ui_current_win_is_otr)(void);
void (*ui_current_set_otr)(gboolean value);
char* (*ui_current_recipient)(void);
void (*ui_current_print_line)(const char * const msg, ...);
void (*ui_current_error_line)(const char * const msg);

View File

@ -54,6 +54,7 @@ win_create(const char * const title, int cols, win_type_t type)
new_win->unread = 0;
new_win->history_shown = 0;
new_win->type = type;
new_win->is_otr = FALSE;
scrollok(new_win->win, TRUE);
return new_win;

View File

@ -48,6 +48,7 @@ typedef struct prof_win_t {
char *from;
WINDOW *win;
win_type_t type;
gboolean is_otr;
int y_pos;
int paged;
int unread;