forked from blue/squawk
95 lines
2.1 KiB
C++
95 lines
2.1 KiB
C++
/*
|
|
* Created by victoria on 2021-05-12.
|
|
*/
|
|
|
|
#include "qomemo.h"
|
|
#include "sce.h"
|
|
#include <shared/qxmppfactories.h>
|
|
|
|
#include <QBuffer>
|
|
#include <QDebug>
|
|
#include <QDomDocument>
|
|
|
|
using namespace QXmpp::Factories;
|
|
|
|
QXmppElement QXmpp::Omemo::EncryptedMessage::header() const {
|
|
auto result = createElement("header");
|
|
result.setAttribute("sid", QString::number(fromDeviceId));
|
|
|
|
auto ivNode = createElement("iv");
|
|
ivNode.setValue(iv);
|
|
|
|
for (const auto &key : keys) {
|
|
result.appendChild(key.toXml());
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
QXmppElement QXmpp::Omemo::EncryptedMessage::toXml() const {
|
|
auto result = createElement("encrypted", "eu.siacs.conversations.axolotl");
|
|
|
|
result.appendChild(header());
|
|
// TODO: Payload is optional
|
|
result.appendChild(payload());
|
|
|
|
return result;
|
|
}
|
|
|
|
QXmppElement QXmpp::Omemo::EncryptedMessage::payload() const {
|
|
QBuffer buffer;
|
|
buffer.open(QIODevice::ReadWrite);
|
|
QXmlStreamWriter writer(&buffer);
|
|
message.toXml(&writer);
|
|
|
|
QDomDocument doc;
|
|
doc.setContent(buffer.data(), true);
|
|
|
|
QXmppElement root(doc.documentElement());
|
|
root.setTagName("payload");
|
|
|
|
return root;
|
|
}
|
|
|
|
QXmppElement QXmpp::Omemo::EncryptedMessage::content() const {
|
|
auto envelope = createElement("content", "urn:xmpp:sce:0");
|
|
|
|
envelope.appendChild(payload());
|
|
|
|
if (!from.isEmpty()) {
|
|
auto fromNode = createElement("from");
|
|
fromNode.setAttribute("jid", from);
|
|
envelope.appendChild(fromNode);
|
|
}
|
|
|
|
if (!to.isEmpty()) {
|
|
auto toNode = createElement("to");
|
|
toNode.setAttribute("jid", to);
|
|
envelope.appendChild(toNode);
|
|
}
|
|
|
|
if (!timestamp.isNull()) {
|
|
auto timeNode = createElement("time");
|
|
timeNode.setAttribute("stamp", timestamp.toString(Qt::DateFormat::ISODate));
|
|
envelope.appendChild(timeNode);
|
|
}
|
|
|
|
auto rpad = createElement("rpad");
|
|
rpad.setValue(QXmpp::Sce::generatePadding());
|
|
envelope.appendChild(rpad);
|
|
|
|
return envelope;
|
|
}
|
|
|
|
QXmppElement QXmpp::Omemo::MessageKey::toXml() const {
|
|
auto result = createElement("key");
|
|
|
|
result.setAttribute("rid", QString::number(receivingDeviceId));
|
|
if (prekey)
|
|
result.setAttribute("prekey", "true");
|
|
|
|
result.setValue(key);
|
|
|
|
return result;
|
|
}
|