summaryrefslogtreecommitdiff
path: root/plugins/MirOTR/src/svcs_proto.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/MirOTR/src/svcs_proto.cpp')
-rw-r--r--plugins/MirOTR/src/svcs_proto.cpp152
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