diff options
Diffstat (limited to 'plugins/MirOTR/src/svcs_proto.cpp')
-rw-r--r-- | plugins/MirOTR/src/svcs_proto.cpp | 152 |
1 files changed, 58 insertions, 94 deletions
diff --git a/plugins/MirOTR/src/svcs_proto.cpp b/plugins/MirOTR/src/svcs_proto.cpp index 1d89651585..22b428145e 100644 --- a/plugins/MirOTR/src/svcs_proto.cpp +++ b/plugins/MirOTR/src/svcs_proto.cpp @@ -21,44 +21,26 @@ INT_PTR SVC_OTRSendMessage(WPARAM wParam,LPARAM lParam){ return 1; // error const char *oldmessage = (const char *)ccs->lParam; - char *oldmessage_utf = NULL; - - //MessageBox(0, "Send message - converting to UTF-8", "msg", MB_OK); - - if(ccs->wParam & PREF_UTF) { - oldmessage_utf = (char*)oldmessage; - } - else if(ccs->wParam & PREF_UNICODE) { - oldmessage_utf = mir_utf8encodeW((wchar_t*)&oldmessage[strlen(oldmessage)+1]); - } - else { - oldmessage_utf = mir_utf8encode(oldmessage); - } - if (!oldmessage_utf) return 1; + if (!oldmessage) + return 1; // don't filter OTR messages being sent (OTR messages should only happen *after* the otrl_message_sending call below) - if(strncmp(oldmessage_utf, "?OTR", 4) == 0) { + if(strncmp(oldmessage, "?OTR", 4) == 0) { DEBUGOUT_T("OTR message without PREF_BYPASS_OTR\n"); - if (!(ccs->wParam & PREF_UTF)) - mir_free(oldmessage_utf); return CallService(MS_PROTO_CHAINSEND, wParam, lParam); } char *tmpencode = NULL; ConnContext *context = otrl_context_find_miranda(otr_user_state, ccs->hContact); if (db_get_b(ccs->hContact, MODULENAME, "HTMLConv", 0) && otr_context_get_trust(context) >= TRUST_UNVERIFIED) { - tmpencode = encode_html_entities_utf8(oldmessage_utf); - if (tmpencode != NULL) { - if (!(ccs->wParam & PREF_UTF)) mir_free(oldmessage_utf); - oldmessage_utf = tmpencode; - } + tmpencode = encode_html_entities_utf8(oldmessage); + if (tmpencode != NULL) + oldmessage = tmpencode; } char *newmessage = NULL; char *username = contact_get_id(ccs->hContact); - gcry_error_t err = otrl_message_sending(otr_user_state, &ops, (void*)ccs->hContact, proto, proto, username, OTRL_INSTAG_BEST, oldmessage_utf, NULL, &newmessage, OTRL_FRAGMENT_SEND_ALL_BUT_LAST, NULL, add_appdata, (void*)ccs->hContact); - if (tmpencode!= NULL || !(ccs->wParam & PREF_UTF)) - mir_free(oldmessage_utf); + gcry_error_t err = otrl_message_sending(otr_user_state, &ops, (void*)ccs->hContact, proto, proto, username, OTRL_INSTAG_BEST, oldmessage, NULL, &newmessage, OTRL_FRAGMENT_SEND_ALL_BUT_LAST, NULL, add_appdata, (void*)ccs->hContact); mir_free(username); if (err) { /* Be *sure* not to send out plaintext */ @@ -66,35 +48,30 @@ INT_PTR SVC_OTRSendMessage(WPARAM wParam,LPARAM lParam){ ShowError(TranslateT(LANG_ENCRYPTION_ERROR)); otrl_message_free(newmessage); return 1; - } else if (newmessage) { - if(!newmessage[0]){ - otrl_message_free(newmessage); - return 1; // skip empty messages (OTR might prevent us sending unencrypted messages by replacing them with empty ones) - } - WPARAM oldflags = ccs->wParam; - if(ccs->wParam & (PREF_UTF|PREF_UNICODE)) { - ccs->lParam = (LPARAM)newmessage; - ccs->wParam &= ~PREF_UNICODE; - ccs->wParam |= PREF_UTF; - } else { - mir_utf8decode(newmessage, NULL); - ccs->lParam = (LPARAM)newmessage; - } - INT_PTR ret = CallService(MS_PROTO_CHAINSEND, wParam, lParam); - - DEBUGOUTA("OTR - sending raw message: '"); - DEBUGOUTA((const char*)ccs->lParam); - DEBUGOUTA("'\n"); + } + + if (newmessage == NULL) + return CallService(MS_PROTO_CHAINSEND, wParam, lParam); + + if(!newmessage[0]){ otrl_message_free(newmessage); - - // reset to original values - ccs->lParam = (LPARAM)oldmessage; - ccs->wParam = oldflags; - return ret; + return 1; // skip empty messages (OTR might prevent us sending unencrypted messages by replacing them with empty ones) } - return CallService(MS_PROTO_CHAINSEND, wParam, lParam); -} + WPARAM oldflags = ccs->wParam; + ccs->lParam = (LPARAM)newmessage; + INT_PTR ret = CallService(MS_PROTO_CHAINSEND, wParam, lParam); + + DEBUGOUTA("OTR - sending raw message: '"); + DEBUGOUTA((const char*)ccs->lParam); + DEBUGOUTA("'\n"); + otrl_message_free(newmessage); + + // reset to original values + ccs->lParam = (LPARAM)oldmessage; + ccs->wParam = oldflags; + return ret; +} INT_PTR SVC_OTRRecvMessage(WPARAM wParam,LPARAM lParam) { @@ -116,17 +93,9 @@ INT_PTR SVC_OTRRecvMessage(WPARAM wParam,LPARAM lParam) return CallService(MS_PROTO_CHAINRECV, wParam, lParam); char *oldmessage = pre->szMessage; - char *oldmessage_utf = NULL; // convert oldmessage to utf-8 - if(pre->flags & PREF_UTF) { - oldmessage_utf = oldmessage; - } else if(pre->flags & PREF_UNICODE) { - oldmessage_utf = mir_utf8encodeW((wchar_t*)(&oldmessage[strlen(oldmessage)+1])); - } else { - oldmessage_utf = mir_utf8encode(oldmessage); - } - if (!oldmessage_utf) return 1; - + if (!oldmessage) + return 1; ConnContext* context=NULL; char *uname = contact_get_id(ccs->hContact); @@ -135,12 +104,9 @@ INT_PTR SVC_OTRRecvMessage(WPARAM wParam,LPARAM lParam) lib_cs_lock(); int ignore_msg = otrl_message_receiving(otr_user_state, &ops, (void*)ccs->hContact, - proto, proto, uname, oldmessage_utf, + proto, proto, uname, oldmessage, &newmessage, &tlvs, &context, add_appdata, (void*)ccs->hContact); mir_free(uname); - - if ( !(pre->flags & PREF_UTF)) - mir_free(oldmessage_utf); OtrlTLV *tlv = otrl_tlv_find(tlvs, OTRL_TLV_DISCONNECTED); if (tlv && !Miranda_Terminated()) { @@ -156,38 +122,36 @@ INT_PTR SVC_OTRRecvMessage(WPARAM wParam,LPARAM lParam) if (newmessage) otrl_message_free(newmessage); return 1; // discard internal protocol messages - } else if (newmessage) { - DWORD oldflags = pre->flags; - pre->flags &= ~PREF_UNICODE; - pre->flags |= PREF_UTF; // just use UTF, so we do not have to recode the message + } + if (newmessage == NULL) + return CallService(MS_PROTO_CHAINRECV, wParam, lParam); + + DWORD oldflags = pre->flags; - typedef void (*msg_free_t)(void*); - msg_free_t msg_free = (msg_free_t)otrl_message_free; - if (db_get_b(ccs->hContact, MODULENAME, "HTMLConv", 0)) { - char* tmp = striphtml(newmessage); - msg_free(newmessage); - newmessage = tmp; - msg_free = mir_free; - } - if (options.prefix_messages) { - size_t len = (strlen(options.prefix)+strlen(newmessage)+1)*sizeof(char); - char* tmp = (char*)mir_alloc( len ); - strcpy(tmp, options.prefix); - strcat(tmp, newmessage); - msg_free(newmessage); - newmessage = tmp; - msg_free = mir_free; - } - pre->szMessage = newmessage; - BOOL ret = CallService(MS_PROTO_CHAINRECV, wParam, lParam); -/// @todo (White-Tiger#1#03/23/15): why are we doing this? - pre->flags = oldflags; - pre->szMessage = oldmessage; + typedef void (*msg_free_t)(void*); + msg_free_t msg_free = (msg_free_t)otrl_message_free; + if (db_get_b(ccs->hContact, MODULENAME, "HTMLConv", 0)) { + char* tmp = striphtml(newmessage); msg_free(newmessage); - return ret; + newmessage = tmp; + msg_free = mir_free; } - return CallService(MS_PROTO_CHAINRECV, wParam, lParam); - + if (options.prefix_messages) { + size_t len = (strlen(options.prefix)+strlen(newmessage)+1)*sizeof(char); + char* tmp = (char*)mir_alloc( len ); + strcpy(tmp, options.prefix); + strcat(tmp, newmessage); + msg_free(newmessage); + newmessage = tmp; + msg_free = mir_free; + } + pre->szMessage = newmessage; + BOOL ret = CallService(MS_PROTO_CHAINRECV, wParam, lParam); +/// @todo (White-Tiger#1#03/23/15): why are we doing this? + pre->flags = oldflags; + pre->szMessage = oldmessage; + msg_free(newmessage); + return ret; } /* Abort the SMP protocol. Used when malformed or unexpected messages |