/* * Created by victoria on 2021-05-12. */ #include "qomemo.h" #include "sce.h" #include #include #include #include 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; }