Skip to content

Commit

Permalink
OmemoManager: Add method for resetting local data
Browse files Browse the repository at this point in the history
  • Loading branch information
melvo authored and lnjX committed Aug 22, 2024
1 parent 1962249 commit 23a3d97
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 42 deletions.
16 changes: 16 additions & 0 deletions src/omemo/QXmppOmemoManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -906,6 +906,22 @@ QXmppTask<void> Manager::buildMissingSessions(const QList<QString> &jids)
return interface.task();
}

///
/// Resets all local OMEMO data for this device and the trust data used by OMEMO.
///
/// ATTENTION: This should only be called after an account is removed from the server since the data
/// on the server is not reset.
///
/// Call \c setUp() once this method is finished and you are logged in to a new account if you want
/// to set up everything for it.
///
/// \since QXmpp 1.9
///
QXmppTask<void> QXmppOmemoManager::resetOwnDeviceLocally()
{
return d->resetOwnDeviceLocally();
}

///
/// Resets all OMEMO data for this device and the trust data used by OMEMO.
///
Expand Down
1 change: 1 addition & 0 deletions src/omemo/QXmppOmemoManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ class QXMPPOMEMO_EXPORT QXmppOmemoManager : public QXmppClientExtension, public
QXmppTask<void> buildMissingSessions(const QList<QString> &jids);

QXmppTask<bool> resetOwnDevice();
QXmppTask<void> resetOwnDeviceLocally();
QXmppTask<bool> resetAll();

QXmppTask<void> setSecurityPolicy(QXmpp::TrustSecurityPolicy securityPolicy);
Expand Down
94 changes: 52 additions & 42 deletions src/omemo/QXmppOmemoManager_p.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3135,65 +3135,75 @@ QXmppTask<bool> ManagerPrivate::resetOwnDevice()

isStarted = false;

auto future = trustManager->resetAll(ns_omemo_2.toString());
future.then(q, [=, this]() mutable {
auto future = omemoStorage->resetAll();
future.then(q, [=, this]() mutable {
deleteDeviceElement([=, this](bool isDeviceElementDeleted) mutable {
if (isDeviceElementDeleted) {
deleteDeviceBundle([=, this](bool isDeviceBundleDeleted) mutable {
if (isDeviceBundleDeleted) {
ownDevice = {};
preKeyPairs.clear();
signedPreKeyPairs.clear();
deviceBundle = {};
devices.clear();

Q_EMIT q->allDevicesRemoved();
}
resetOwnDeviceLocally().then(q, [this, interface]() mutable {
deleteDeviceElement([=, this](bool isDeviceElementDeleted) mutable {
if (isDeviceElementDeleted) {
deleteDeviceBundle([=, this](bool isDeviceBundleDeleted) mutable {
if (isDeviceBundleDeleted) {
ownDevice = {};
preKeyPairs.clear();
signedPreKeyPairs.clear();
deviceBundle = {};
devices.clear();

Q_EMIT q->allDevicesRemoved();
}

interface.finish(std::move(isDeviceBundleDeleted));
});
} else {
interface.finish(false);
}
});
interface.finish(std::move(isDeviceBundleDeleted));
});
} else {
interface.finish(false);
}
});
});

return interface.task();
}

// See QXmppOmemoManager for documentation
QXmppTask<bool> ManagerPrivate::resetAll()
QXmppTask<void> QXmppOmemoManagerPrivate::resetOwnDeviceLocally()
{
QXmppPromise<bool> interface;
QXmppPromise<void> interface;

isStarted = false;

auto future = trustManager->resetAll(ns_omemo_2.toString());
future.then(q, [this, interface]() mutable {
auto future = omemoStorage->resetAll();
future.then(q, [this, interface]() mutable {
deleteNode(ns_omemo_2_devices.toString(), [this, interface](bool isDevicesNodeDeleted) mutable {
if (isDevicesNodeDeleted) {
deleteNode(ns_omemo_2_bundles.toString(), [this, interface](bool isBundlesNodeDeleted) mutable {
if (isBundlesNodeDeleted) {
ownDevice = {};
preKeyPairs.clear();
signedPreKeyPairs.clear();
deviceBundle = {};
devices.clear();

Q_EMIT q->allDevicesRemoved();
}
interface.finish();
});
});

interface.finish(std::move(isBundlesNodeDeleted));
});
} else {
interface.finish(false);
}
});
return interface.task();
}

// See QXmppOmemoManager for documentation
QXmppTask<bool> ManagerPrivate::resetAll()
{
QXmppPromise<bool> interface;

isStarted = false;

resetOwnDeviceLocally().then(q, [this, interface]() mutable {
deleteNode(ns_omemo_2_devices.toString(), [this, interface](bool isDevicesNodeDeleted) mutable {
if (isDevicesNodeDeleted) {
deleteNode(ns_omemo_2_bundles.toString(), [this, interface](bool isBundlesNodeDeleted) mutable {
if (isBundlesNodeDeleted) {
ownDevice = {};
preKeyPairs.clear();
signedPreKeyPairs.clear();
deviceBundle = {};
devices.clear();

Q_EMIT q->allDevicesRemoved();
}

interface.finish(std::move(isBundlesNodeDeleted));
});
} else {
interface.finish(false);
}
});
});

Expand Down
1 change: 1 addition & 0 deletions src/omemo/QXmppOmemoManager_p.h
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,7 @@ class QXmppOmemoManagerPrivate
QXmppTask<Result> unsubscribeFromDeviceList(const QString &jid);

QXmppTask<bool> resetOwnDevice();
QXmppTask<void> resetOwnDeviceLocally();
QXmppTask<bool> resetAll();

QXmppTask<bool> buildSessionForNewDevice(const QString &jid, uint32_t deviceId, QXmppOmemoStorage::Device &device);
Expand Down

0 comments on commit 23a3d97

Please sign in to comment.