forked from blue/squawk
Some work on omemo handler, NOT DONE, BUILD FAILS!
This commit is contained in:
parent
820dc845ea
commit
0b61b6e928
3
.gitmodules
vendored
3
.gitmodules
vendored
@ -1,3 +1,6 @@
|
|||||||
[submodule "external/qxmpp"]
|
[submodule "external/qxmpp"]
|
||||||
path = external/qxmpp
|
path = external/qxmpp
|
||||||
url = https://github.com/qxmpp-project/qxmpp.git
|
url = https://github.com/qxmpp-project/qxmpp.git
|
||||||
|
[submodule "external/storage"]
|
||||||
|
path = external/storage
|
||||||
|
url = https://git.macaw.me/blue/storage
|
||||||
|
@ -147,7 +147,13 @@ else ()
|
|||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
## LMDB
|
## LMDB
|
||||||
find_package(LMDB REQUIRED)
|
#find_package(LMDB REQUIRED)
|
||||||
|
|
||||||
|
|
||||||
|
#TODO conditioning!
|
||||||
|
add_subdirectory(external/storage)
|
||||||
|
target_include_directories(squawk PRIVATE external/storage)
|
||||||
|
target_link_libraries(squawk PRIVATE storage)
|
||||||
|
|
||||||
# Linking
|
# Linking
|
||||||
target_link_libraries(squawk
|
target_link_libraries(squawk
|
||||||
|
@ -14,4 +14,148 @@
|
|||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#include <QDebug>
|
||||||
#include "omemohandler.h"
|
#include "omemohandler.h"
|
||||||
|
#include "core/account.h"
|
||||||
|
|
||||||
|
Core::OmemoHandler::OmemoHandler(Account* account) :
|
||||||
|
QXmppOmemoStorage(),
|
||||||
|
acc(account),
|
||||||
|
ownDevice(std::nullopt),
|
||||||
|
db("omemo"),
|
||||||
|
meta(db.addCache<QString, QVariant>("meta")),
|
||||||
|
devices(db.addCache<QString, QHash<uint32_t, Device>>("devices")),
|
||||||
|
preKeyPairs(db.addCache<uint32_t, QByteArray>("preKeyPairs")),
|
||||||
|
signedPreKeyPairs(db.addCache<uint32_t, QXmppOmemoStorage::SignedPreKeyPair>("signedPreKeyPairs"))
|
||||||
|
{
|
||||||
|
db.open();
|
||||||
|
try {
|
||||||
|
QVariant own = meta->getRecord("ownDevice");
|
||||||
|
ownDevice.value() = own.value<OwnDevice>();
|
||||||
|
qDebug() << "Successfully found own device omemo data for account" << acc->getName();
|
||||||
|
} catch (const DataBase::NotFound& e) {
|
||||||
|
qDebug() << "No device omemo data was found for account" << acc->getName();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Core::OmemoHandler::~OmemoHandler() {
|
||||||
|
db.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
QFuture<void> Core::OmemoHandler::emptyVoidFuture() {
|
||||||
|
QFutureInterface<QXmppOmemoStorage::OmemoData> result(QFutureInterfaceBase::Started);
|
||||||
|
result.reportFinished();
|
||||||
|
return result.future();
|
||||||
|
}
|
||||||
|
|
||||||
|
QFuture<QXmppOmemoStorage::OmemoData> Core::OmemoHandler::allData() {
|
||||||
|
OmemoData data;
|
||||||
|
data.ownDevice = ownDevice;
|
||||||
|
|
||||||
|
std::map<uint32_t, QByteArray> pkeys = preKeyPairs->readAll();
|
||||||
|
for (const std::pair<const uint32_t, QByteArray>& pair : pkeys) {
|
||||||
|
data.preKeyPairs.insert(pair.first, pair.second);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::map<uint32_t, QXmppOmemoStorage::SignedPreKeyPair> spre = signedPreKeyPairs->readAll();
|
||||||
|
for (const std::pair<const uint32_t, QXmppOmemoStorage::SignedPreKeyPair>& pair : spre) {
|
||||||
|
data.signedPreKeyPairs.insert(pair.first, pair.second);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::map<QString, QHash<uint32_t, Device>> devs = devices->readAll();
|
||||||
|
for (const std::pair<const QString, QHash<uint32_t, Device>>& pair : devs) {
|
||||||
|
data.devices.insert(pair.first, pair.second);
|
||||||
|
}
|
||||||
|
|
||||||
|
QFutureInterface<QXmppOmemoStorage::OmemoData> result(QFutureInterfaceBase::Started);
|
||||||
|
result.reportResult(std::move(data));
|
||||||
|
result.reportFinished();
|
||||||
|
return result.future();
|
||||||
|
}
|
||||||
|
|
||||||
|
QFuture<void> Core::OmemoHandler::addDevice(const QString& jid, uint32_t deviceId, const QXmppOmemoStorage::Device& device) {
|
||||||
|
QHash<uint32_t, Device> devs;
|
||||||
|
bool had = true;
|
||||||
|
try {
|
||||||
|
devs = devices->getRecord(jid);
|
||||||
|
} catch (const DataBase::NotFound& error) {
|
||||||
|
had = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
devs.insert(deviceId, device);
|
||||||
|
if (had) {
|
||||||
|
devices->changeRecord(jid, devs);
|
||||||
|
} else {
|
||||||
|
devices->addRecord(jid, devs);
|
||||||
|
}
|
||||||
|
|
||||||
|
return emptyVoidFuture();
|
||||||
|
}
|
||||||
|
|
||||||
|
QFuture<void> Core::OmemoHandler::addPreKeyPairs(const QHash<uint32_t, QByteArray>& keyPairs) {
|
||||||
|
for (QHash<uint32_t, QByteArray>::const_iterator itr = keyPairs.begin(), end = keyPairs.end(); itr != end; ++itr) {
|
||||||
|
preKeyPairs->forceRecord(itr.key(), itr.value());
|
||||||
|
}
|
||||||
|
|
||||||
|
return emptyVoidFuture();
|
||||||
|
}
|
||||||
|
|
||||||
|
QFuture<void> Core::OmemoHandler::addSignedPreKeyPair(uint32_t keyId, const QXmppOmemoStorage::SignedPreKeyPair& keyPair) {
|
||||||
|
signedPreKeyPairs->addRecord(keyId, keyPair);
|
||||||
|
return emptyVoidFuture();
|
||||||
|
}
|
||||||
|
|
||||||
|
QFuture<void> Core::OmemoHandler::removeDevice(const QString& jid, uint32_t deviceId) {
|
||||||
|
QHash<uint32_t, Device> devs = devices->getRecord(jid);
|
||||||
|
devs.remove(deviceId);
|
||||||
|
if (devs.isEmpty()) {
|
||||||
|
devices->removeRecord(jid);
|
||||||
|
} else {
|
||||||
|
devices->changeRecord(jid, devs);
|
||||||
|
}
|
||||||
|
return emptyVoidFuture();
|
||||||
|
}
|
||||||
|
|
||||||
|
QFuture<void> Core::OmemoHandler::removeDevices(const QString& jid) {
|
||||||
|
devices->removeRecord(jid);
|
||||||
|
return emptyVoidFuture();
|
||||||
|
}
|
||||||
|
|
||||||
|
QFuture<void> Core::OmemoHandler::removePreKeyPair(uint32_t keyId) {
|
||||||
|
preKeyPairs->removeRecord(keyId);
|
||||||
|
return emptyVoidFuture();
|
||||||
|
}
|
||||||
|
|
||||||
|
QFuture<void> Core::OmemoHandler::removeSignedPreKeyPair(uint32_t keyId) {
|
||||||
|
signedPreKeyPairs->removeRecord(keyId);
|
||||||
|
return emptyVoidFuture();
|
||||||
|
}
|
||||||
|
|
||||||
|
QFuture<void> Core::OmemoHandler::setOwnDevice(const std::optional<OwnDevice>& device) {
|
||||||
|
bool had = ownDevice.has_value();
|
||||||
|
ownDevice = device;
|
||||||
|
if (ownDevice.has_value()) {
|
||||||
|
if (had) {
|
||||||
|
meta->changeRecord("ownDevice", QVariant::fromValue(ownDevice.value()));
|
||||||
|
} else {
|
||||||
|
meta->addRecord("ownDevice", QVariant::fromValue(ownDevice.value()));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (had) {
|
||||||
|
meta->removeRecord("ownDevice");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return emptyVoidFuture();
|
||||||
|
}
|
||||||
|
|
||||||
|
QFuture<void> Core::OmemoHandler::resetAll() {
|
||||||
|
ownDevice = std::nullopt;
|
||||||
|
db.drop();
|
||||||
|
|
||||||
|
return emptyVoidFuture();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,14 +18,17 @@
|
|||||||
#define CORE_OMEMOHANDLER_H
|
#define CORE_OMEMOHANDLER_H
|
||||||
|
|
||||||
#include <QXmppOmemoStorage.h>
|
#include <QXmppOmemoStorage.h>
|
||||||
#include <core/storage/cache.h>
|
#include <cache.h>
|
||||||
|
|
||||||
|
Q_DECLARE_METATYPE(QXmppOmemoStorage::OwnDevice);
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
|
class Account;
|
||||||
|
|
||||||
class OmemoHandler : public QXmppOmemoStorage
|
class OmemoHandler : public QXmppOmemoStorage
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
OmemoHandler();
|
OmemoHandler(Account* account);
|
||||||
~OmemoHandler() override;
|
~OmemoHandler() override;
|
||||||
|
|
||||||
QFuture<OmemoData> allData() override;
|
QFuture<OmemoData> allData() override;
|
||||||
@ -45,13 +48,24 @@ public:
|
|||||||
QFuture<void> resetAll() override;
|
QFuture<void> resetAll() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
static QFuture<void> emptyVoidFuture();
|
||||||
|
|
||||||
|
private:
|
||||||
|
Account* acc;
|
||||||
std::optional<OwnDevice> ownDevice;
|
std::optional<OwnDevice> ownDevice;
|
||||||
Cache<QString, QHash<uint32_t, Device>> devices;
|
DataBase db;
|
||||||
Cache<uint32_t, QByteArray> preKeyPairs;
|
DataBase::Cache<QString, QVariant>* meta;
|
||||||
Cache<uint32_t, QXmppOmemoStorage::SignedPreKeyPair> signedPreKeyPairs;
|
DataBase::Cache<QString, QHash<uint32_t, Device>>* devices;
|
||||||
|
DataBase::Cache<uint32_t, QByteArray>* preKeyPairs;
|
||||||
|
DataBase::Cache<uint32_t, QXmppOmemoStorage::SignedPreKeyPair>* signedPreKeyPairs;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QDataStream& operator << (QDataStream &out, const QXmppOmemoStorage::Device& device);
|
||||||
|
QDataStream& operator >> (QDataStream &out, QXmppOmemoStorage::Device device);
|
||||||
|
|
||||||
|
QDataStream& operator << (QDataStream &out, const QXmppOmemoStorage::SignedPreKeyPair& device);
|
||||||
|
QDataStream& operator >> (QDataStream &out, QXmppOmemoStorage::SignedPreKeyPair device);
|
||||||
|
|
||||||
#endif // CORE_OMEMOHANDLER_H
|
#endif // CORE_OMEMOHANDLER_H
|
||||||
|
2
external/qxmpp
vendored
2
external/qxmpp
vendored
@ -1 +1 @@
|
|||||||
Subproject commit fe83e9c3d42c3becf682e2b5ecfc9d77b24c614f
|
Subproject commit f6e7591e21b4c55319918ac296b2341b2e9f1988
|
1
external/storage
vendored
Submodule
1
external/storage
vendored
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 08daad48ad36d9f12dc6485a085190e31e4cf49e
|
@ -33,6 +33,10 @@
|
|||||||
#include <QtWidgets/QApplication>
|
#include <QtWidgets/QApplication>
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
|
|
||||||
|
#ifdef WITH_OMEMO
|
||||||
|
#include <QXmppOmemoStorage.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
qRegisterMetaType<Shared::Message>("Shared::Message");
|
qRegisterMetaType<Shared::Message>("Shared::Message");
|
||||||
@ -40,12 +44,15 @@ int main(int argc, char *argv[])
|
|||||||
qRegisterMetaType<Shared::VCard>("Shared::VCard");
|
qRegisterMetaType<Shared::VCard>("Shared::VCard");
|
||||||
qRegisterMetaType<std::list<Shared::Message>>("std::list<Shared::Message>");
|
qRegisterMetaType<std::list<Shared::Message>>("std::list<Shared::Message>");
|
||||||
qRegisterMetaType<std::list<Shared::MessageInfo>>("std::list<Shared::MessageInfo>");
|
qRegisterMetaType<std::list<Shared::MessageInfo>>("std::list<Shared::MessageInfo>");
|
||||||
qRegisterMetaType<std::list<Shared::MessageInfo>>("std::list<QString>");
|
qRegisterMetaType<std::list<QString>>("std::list<QString>");
|
||||||
qRegisterMetaType<std::list<Shared::MessageInfo>>("std::set<QString>");
|
qRegisterMetaType<std::set<QString>>("std::set<QString>");
|
||||||
qRegisterMetaType<std::list<Shared::MessageInfo>>("std::list<Shared::Identity>");
|
qRegisterMetaType<std::list<Shared::Identity>>("std::list<Shared::Identity>");
|
||||||
qRegisterMetaType<QSet<QString>>("QSet<QString>");
|
qRegisterMetaType<QSet<QString>>("QSet<QString>");
|
||||||
qRegisterMetaType<Shared::ConnectionState>("Shared::ConnectionState");
|
qRegisterMetaType<Shared::ConnectionState>("Shared::ConnectionState");
|
||||||
qRegisterMetaType<Shared::Availability>("Shared::Availability");
|
qRegisterMetaType<Shared::Availability>("Shared::Availability");
|
||||||
|
#ifdef WITH_OMEMO
|
||||||
|
qRegisterMetaType<QXmppOmemoStorage::OwnDevice>("QXmppOmemoStorage::OwnDevice");
|
||||||
|
#endif
|
||||||
|
|
||||||
QApplication app(argc, argv);
|
QApplication app(argc, argv);
|
||||||
SignalCatcher sc(&app);
|
SignalCatcher sc(&app);
|
||||||
|
Loading…
Reference in New Issue
Block a user