From e2ca3cbbeba69708be1d8c7cb3e8f89544a5b494 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Thu, 1 Feb 2018 17:42:42 +0100 Subject: [PATCH] Prevent encryption of IMDN messages signaling an error. --- src/chat/chat-message/chat-message-p.h | 3 +++ src/chat/chat-message/chat-message.cpp | 22 +++++++++++++--------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/chat/chat-message/chat-message-p.h b/src/chat/chat-message/chat-message-p.h index 1be3d1619..0eae6c24e 100644 --- a/src/chat/chat-message/chat-message-p.h +++ b/src/chat/chat-message/chat-message-p.h @@ -93,6 +93,8 @@ public: void setChatRoom (const std::shared_ptr &chatRoom); + void setEncryptionPrevented (bool value) { encryptionPrevented = value; } + // ----------------------------------------------------------------------------- // Deprecated methods only used for C wrapper, to be removed some day... // ----------------------------------------------------------------------------- @@ -169,6 +171,7 @@ private: ChatMessage::State state = ChatMessage::State::Idle; ChatMessage::Direction direction = ChatMessage::Direction::Incoming; + bool encryptionPrevented = false; bool toBeStored = true; L_DECLARE_PUBLIC(ChatMessage); diff --git a/src/chat/chat-message/chat-message.cpp b/src/chat/chat-message/chat-message.cpp index c3638d259..d6f7d3f95 100644 --- a/src/chat/chat-message/chat-message.cpp +++ b/src/chat/chat-message/chat-message.cpp @@ -353,6 +353,8 @@ void ChatMessagePrivate::sendImdn (Imdn::Type imdnType, LinphoneReason reason) { content->setBody(Imdn::createXml(imdnId, time, imdnType, reason)); msg->addContent(*content); + if (reason != LinphoneReasonNone) + msg->getPrivate()->setEncryptionPrevented(true); msg->setToBeStored(false); msg->getPrivate()->send(); @@ -628,15 +630,17 @@ void ChatMessagePrivate::send () { if ((currentSendStep &ChatMessagePrivate::Step::Encryption) == ChatMessagePrivate::Step::Encryption) { lInfo() << "Encryption step already done, skipping"; } else { - EncryptionChatMessageModifier ecmm; - ChatMessageModifier::Result result = ecmm.encode(q->getSharedFromThis(), errorCode); - if (result == ChatMessageModifier::Result::Error) { - sal_error_info_set((SalErrorInfo *)op->get_error_info(), SalReasonNotAcceptable, "SIP", errorCode, "Unable to encrypt IM", nullptr); - setState(ChatMessage::State::NotDelivered); - return; - } else if (result == ChatMessageModifier::Result::Suspended) { - currentSendStep |= ChatMessagePrivate::Step::Encryption; - return; + if (!encryptionPrevented) { + EncryptionChatMessageModifier ecmm; + ChatMessageModifier::Result result = ecmm.encode(q->getSharedFromThis(), errorCode); + if (result == ChatMessageModifier::Result::Error) { + sal_error_info_set((SalErrorInfo *)op->get_error_info(), SalReasonNotAcceptable, "SIP", errorCode, "Unable to encrypt IM", nullptr); + setState(ChatMessage::State::NotDelivered); + return; + } else if (result == ChatMessageModifier::Result::Suspended) { + currentSendStep |= ChatMessagePrivate::Step::Encryption; + return; + } } currentSendStep |= ChatMessagePrivate::Step::Encryption; }