/* * Created by victoria on 2021-05-12. */ #include "bundle.h" #include #include #include "shared/qxmppfactories.h" using namespace QXmpp::Factories; QXmppElement QXmpp::Omemo::PreKey::toXml() const { auto pk = createElement("preKeyPublic"); pk.setAttribute("preKeyId", QString::number(id)); // TODO: Base64 pk.setValue(data); return pk; } void QXmpp::Omemo::PreKey::fromXml(const QXmppElement &element) { if (!elementMatches(element, "preKeyPublic")) return; id = element.attribute("preKeyId").toInt(); // TODO: Base64 data = element.value(); } QXmppElement QXmpp::Omemo::Bundle::toXml() const { auto spkNode = createElement("signedPreKeyPublic"); spkNode.setAttribute("signedPreKeyId", QString::number(spkId)); spkNode.setValue(spk); auto spksNode = createElement("signedPreKeySignature"); spksNode.setValue(spks); auto ikNode = createElement("identityKey"); ikNode.setValue(ik); auto prekeysNode = createElement("prekeys"); for (const auto &pk : prekeys) { prekeysNode.appendChild(pk.toXml()); } auto result = createElement("bundle", "eu.siacs.conversations.axolotl"); result.appendChild(spkNode); result.appendChild(spksNode); result.appendChild(ikNode); result.appendChild(prekeysNode); return result; } QXmppIq QXmpp::Omemo::Bundle::toIq(int deviceId) const { QXmppIq iq{}; iq.setType(QXmppIq::Set); auto item = createElement("item"); item.appendChild(toXml()); auto publish = createElement("publish"); publish.setAttribute( "node", QString("eu.siacs.conversations.axolotl.bundles:%s").arg(deviceId)); publish.appendChild(item); auto pubSub = createElement("pubsub", "http://jabber.org/protocol/pubsub"); pubSub.appendChild(publish); pubSub.appendChild(createOpenPublishOptions()); iq.extensions().push_back(pubSub); return iq; } void QXmpp::Omemo::Bundle::fromXml(const QXmppElement &element) { if (!elementMatches(element, "bundle", "eu.siacs.conversations.axolotl")) return; auto spkNode = element.firstChildElement("spk"); if (spkNode.isNull()) { qWarning() << "'bundle': missing 'spk'"; return; } spk = spkNode.value(); spkId = spkNode.attribute("id").toInt(); auto spksNode = element.firstChildElement("spks"); if (spksNode.isNull()) { qWarning() << "'bundle': missing 'spks'"; return; } spks = spksNode.value(); auto ikNode = element.firstChildElement("ik"); if (ikNode.isNull()) { qWarning() << "'bundle': missing 'ik'"; return; } ik = ikNode.value(); auto prekeysNode = element.firstChildElement("prekeys"); auto pkNode = prekeysNode.firstChildElement("pk"); prekeys.clear(); while (!pkNode.isNull()) { PreKey pk{}; pk.fromXml(pkNode); prekeys.push_back(pk); } } QXmppPubSubIq QXmpp::Omemo::Bundle::fetchDeviceBundleIq(int deviceId) { QXmppPubSubIq iq{}; iq.setType(QXmppIq::Get); iq.setQueryNode( QString("eu.siacs.conversations.axolotl.bundles:%1").arg(deviceId)); QXmppPubSubItem item{}; item.setId(QString::number(deviceId)); iq.setItems({item}); return iq; }