blob: 99417201350f14e0f5bfa941c6e71483ed65fe36 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
/*
* Copyright (C) 2008-2021 The QXmpp developers
*
* Author:
* Manjeet Dahiya
*
* Source:
* https://github.com/qxmpp-project/qxmpp
*
* This file is a part of QXmpp library.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
*/
#include "QXmppCarbonManager.h"
#include "QXmppClient.h"
#include "QXmppConstants_p.h"
#include "QXmppDiscoveryManager.h"
#include "QXmppMessage.h"
#include "QXmppUtils.h"
#include <QDomElement>
QXmppCarbonManager::QXmppCarbonManager()
: m_carbonsEnabled(false)
{
}
QXmppCarbonManager::~QXmppCarbonManager()
{
}
///
/// Returns whether message carbons are currently enabled
///
bool QXmppCarbonManager::carbonsEnabled() const
{
return m_carbonsEnabled;
}
///
/// Enables or disables message carbons for this connection.
///
/// This function does not check whether the server supports
/// message carbons, but just sends the corresponding stanza
/// to the server, so one must check in advance by using the
/// discovery manager.
///
/// By default, carbon copies are disabled.
///
void QXmppCarbonManager::setCarbonsEnabled(bool enabled)
{
if (m_carbonsEnabled == enabled)
return;
m_carbonsEnabled = enabled;
if (client()) {
QXmppIq iq(QXmppIq::Set);
QXmppElement carbonselement;
carbonselement.setTagName(m_carbonsEnabled ? "enable" : "disable");
carbonselement.setAttribute("xmlns", ns_carbons);
iq.setExtensions(QXmppElementList() << carbonselement);
client()->sendPacket(iq);
}
}
/// \cond
QStringList QXmppCarbonManager::discoveryFeatures() const
{
return QStringList() << ns_carbons;
}
bool QXmppCarbonManager::handleStanza(const QDomElement &element)
{
if (element.tagName() != "message")
return false;
bool sent = true;
QDomElement carbon = element.firstChildElement("sent");
if (carbon.isNull()) {
carbon = element.firstChildElement("received");
sent = false;
}
if (carbon.isNull() || carbon.namespaceURI() != ns_carbons)
return false;
// carbon copies must always come from our bare JID
if (element.attribute("from") != client()->configuration().jidBare()) {
info("Received carbon copy from possible attacker trying to use CVE-2017-5603.");
return false;
}
auto forwarded = carbon.firstChildElement("forwarded");
auto messageElement = forwarded.firstChildElement("message");
if (messageElement.isNull())
return false;
QXmppMessage message;
message.parse(messageElement);
if (sent)
emit messageSent(message);
else
emit messageReceived(message);
return true;
}
/// \endcond
///
/// \fn QXmppCarbonManager::messageReceived()
///
/// Emitted when a message was received from someone else and directed to
/// another resource.
///
/// If you connect this signal to the QXmppClient::messageReceived signal, they
/// will appear as normal messages.
///
///
/// \fn QXmppCarbonManager::messageSent()
///
/// Emitted when another resource sent a message to someone else.
///
|