From 1484e94b355dc8f41d7285206b114a3e8251a1d9 Mon Sep 17 00:00:00 2001 From: James Booth Date: Thu, 27 Aug 2015 00:37:48 +0100 Subject: [PATCH] Fixed OTR decryption check --- src/common.c | 2 +- src/common.h | 2 +- src/event/server_events.c | 2 +- src/otr/otr.c | 28 +++++++++++++++------------- src/otr/otr.h | 4 ++-- tests/unittests/test_common.c | 8 ++++++++ tests/unittests/test_common.h | 1 + tests/unittests/unittests.c | 1 + 8 files changed, 30 insertions(+), 18 deletions(-) diff --git a/src/common.c b/src/common.c index bd8b1742..fc701b8b 100644 --- a/src/common.c +++ b/src/common.c @@ -193,7 +193,7 @@ str_replace(const char *string, const char *substr, } gboolean -str_contains_str(char *searchstr, char *substr) +str_contains_str(const char * const searchstr, const char * const substr) { return g_strrstr(searchstr, substr) != NULL; } diff --git a/src/common.h b/src/common.h index 1e50a87a..a1e0226e 100644 --- a/src/common.h +++ b/src/common.h @@ -104,7 +104,7 @@ gboolean create_dir(char *name); gboolean mkdir_recursive(const char *dir); char * str_replace(const char *string, const char *substr, const char *replacement); -gboolean str_contains_str(char *searchstr, char *substr); +gboolean str_contains_str(const char * const searchstr, const char * const substr); int str_contains(const char str[], int size, char ch); gboolean strtoi_range(char *str, int *saveptr, int min, int max, char **err_msg); int utf8_display_len(const char * const str); diff --git a/src/event/server_events.c b/src/event/server_events.c index 7fb2427c..ae85d32a 100644 --- a/src/event/server_events.c +++ b/src/event/server_events.c @@ -219,7 +219,7 @@ _sv_ev_incoming_otr(ProfChatWin *chatwin, gboolean new_win, char *barejid, char gboolean decrypted = FALSE; char *otr_res = otr_on_message_recv(barejid, resource, message, &decrypted); if (otr_res) { - if (decrypted && g_strrstr(otr_res, message) == NULL) { + if (decrypted) { ui_incoming_msg(chatwin, resource, otr_res, NULL, new_win, PROF_ENC_OTR); } else { ui_incoming_msg(chatwin, resource, otr_res, NULL, new_win, PROF_ENC_NONE); diff --git a/src/otr/otr.c b/src/otr/otr.c index 7953733d..7e68ecb3 100644 --- a/src/otr/otr.c +++ b/src/otr/otr.c @@ -274,7 +274,7 @@ otr_on_connect(ProfAccount *account) } char* -otr_on_message_recv(const char * const barejid, const char * const resource, const char * const message, gboolean *was_decrypted) +otr_on_message_recv(const char * const barejid, const char * const resource, const char * const message, gboolean *decrypted) { prof_otrpolicy_t policy = otr_get_policy(barejid); char *whitespace_base = strstr(message, OTRL_MESSAGE_TAG_BASE); @@ -298,19 +298,19 @@ otr_on_message_recv(const char * const barejid, const char * const resource, con } } - char *decrypted = otr_decrypt_message(barejid, message, was_decrypted); - if (!decrypted) { // internal OTR message + char *newmessage = otr_decrypt_message(barejid, message, decrypted); + if (!newmessage) { // internal OTR message return NULL; } - if (policy == PROF_OTRPOLICY_ALWAYS && *was_decrypted == FALSE && !whitespace_base) { + if (policy == PROF_OTRPOLICY_ALWAYS && *decrypted == FALSE && !whitespace_base) { char *otr_query_message = otr_start_query(); cons_show("Attempting to start OTR session..."); char *id = message_send_chat_otr(barejid, otr_query_message); free(id); } - return decrypted; + return newmessage; } gboolean @@ -717,12 +717,12 @@ _otr_tlv_free(OtrlTLV *tlvs) } char * -otr_decrypt_message(const char * const from, const char * const message, gboolean *was_decrypted) +otr_decrypt_message(const char * const from, const char * const message, gboolean *decrypted) { - char *decrypted = NULL; + char *newmessage = NULL; OtrlTLV *tlvs = NULL; - int result = otrlib_decrypt_message(user_state, &ops, jid, from, message, &decrypted, &tlvs); + int result = otrlib_decrypt_message(user_state, &ops, jid, from, message, &newmessage, &tlvs); // internal libotr message if (result == 1) { @@ -743,16 +743,18 @@ otr_decrypt_message(const char * const from, const char * const message, gboolea return NULL; - // message was decrypted, return to user - } else if (decrypted) { + // message was processed, return to user + } else if (newmessage) { _otr_tlv_free(tlvs); - *was_decrypted = TRUE; - return decrypted; + if (g_str_has_prefix(message, "?OTR:")) { + *decrypted = TRUE; + } + return newmessage; // normal non OTR message } else { _otr_tlv_free(tlvs); - *was_decrypted = FALSE; + *decrypted = FALSE; return strdup(message); } } diff --git a/src/otr/otr.h b/src/otr/otr.h index 45abdc20..cd11709f 100644 --- a/src/otr/otr.h +++ b/src/otr/otr.h @@ -58,7 +58,7 @@ char* otr_start_query(void); void otr_poll(void); void otr_on_connect(ProfAccount *account); -char* otr_on_message_recv(const char * const barejid, const char * const resource, const char * const message, gboolean *was_decrypted); +char* otr_on_message_recv(const char * const barejid, const char * const resource, const char * const message, gboolean *decrypted); gboolean otr_on_message_send(ProfChatWin *chatwin, const char * const message); void otr_keygen(ProfAccount *account); @@ -83,7 +83,7 @@ char * otr_get_their_fingerprint(const char * const recipient); char * otr_encrypt_message(const char * const to, const char * const message); char * otr_decrypt_message(const char * const from, const char * const message, - gboolean *was_decrypted); + gboolean *decrypted); void otr_free_message(char *message); diff --git a/tests/unittests/test_common.c b/tests/unittests/test_common.c index ac1e562a..8df3790a 100644 --- a/tests/unittests/test_common.c +++ b/tests/unittests/test_common.c @@ -663,6 +663,14 @@ void str_contains_str_in_middle(void **state) assert_true(str_contains_str(main, occur)); } +void str_contains_str_whole(void **state) +{ + char *main = "somestring"; + char *occur = "somestring"; + + assert_true(str_contains_str(main, occur)); +} + void str_empty_not_contains_str(void **state) { char *main = NULL; diff --git a/tests/unittests/test_common.h b/tests/unittests/test_common.h index 1f24e6b1..6f3f1698 100644 --- a/tests/unittests/test_common.h +++ b/tests/unittests/test_common.h @@ -60,6 +60,7 @@ void str_not_contains_str(void **state); void str_contains_str_at_start(void **state); void str_contains_str_at_end(void **state); void str_contains_str_in_middle(void **state); +void str_contains_str_whole(void **state); void str_empty_not_contains_str(void **state); void str_not_contains_str_empty(void **state); void str_empty_not_contains_str_empty(void **state); diff --git a/tests/unittests/unittests.c b/tests/unittests/unittests.c index 6e88debb..83aee297 100644 --- a/tests/unittests/unittests.c +++ b/tests/unittests/unittests.c @@ -99,6 +99,7 @@ int main(int argc, char* argv[]) { unit_test(str_contains_str_at_start), unit_test(str_contains_str_at_end), unit_test(str_contains_str_in_middle), + unit_test(str_contains_str_whole), unit_test(str_empty_not_contains_str), unit_test(str_not_contains_str_empty), unit_test(str_empty_not_contains_str_empty),