aboutsummaryrefslogtreecommitdiff
path: root/src/omemo/QXmppOmemoManager_p.cpp
diff options
context:
space:
mode:
authorMelvin Keskin <melvo@olomono.de>2022-10-26 21:55:08 +0200
committerLinus Jahn <lnj@kaidan.im>2022-12-22 16:17:19 +0100
commitbe1319577af4bf5545ee645ae61e385d95a969f9 (patch)
treeac264d7065ab161f20e8c86c1e3c83f51206167f /src/omemo/QXmppOmemoManager_p.cpp
parent998cf2b6c2dea966d970a7fef0a43926a8b37c9c (diff)
downloadqxmpp-be1319577af4bf5545ee645ae61e385d95a969f9.tar.gz
OmemoManagerPrivate: Fix device setup
Diffstat (limited to 'src/omemo/QXmppOmemoManager_p.cpp')
-rw-r--r--src/omemo/QXmppOmemoManager_p.cpp38
1 files changed, 29 insertions, 9 deletions
diff --git a/src/omemo/QXmppOmemoManager_p.cpp b/src/omemo/QXmppOmemoManager_p.cpp
index d85c8a7a..18e0d34d 100644
--- a/src/omemo/QXmppOmemoManager_p.cpp
+++ b/src/omemo/QXmppOmemoManager_p.cpp
@@ -620,24 +620,44 @@ QFuture<bool> ManagerPrivate::setUpDeviceId()
auto future = pubSubManager->requestPepItemIds(ns_omemo_2_bundles);
await(future, q, [=](QXmppPubSubManager::ItemIdsResult result) mutable {
- if (auto error = std::get_if<Error>(&result)) {
- warning("Existing / Published device IDs could not be retrieved");
+ // There can be the following cases:
+ // 1. There is no PubSub node for device bundles: XEP-0030 states that a server must
+ // respond with an error (at least ejabberd 22.05 responds with an empty node instead).
+ // 2. There is an empty PubSub node for device bundles: XEP-0030 states that a server must
+ // respond with a node without included items.
+ if (auto error = std::get_if<Error>(&result); error && !(error->type() == Error::Cancel && error->condition() == Error::ItemNotFound)) {
+ warning("Existing / Published device IDs could not be retrieved: " % errorToString(*error));
reportFinishedResult(interface, false);
} else {
- const auto &deviceIds = std::get<QVector<QString>>(result);
-
- while (true) {
- uint32_t deviceId = 0;
+ auto generateDeviceId = [this, interface](uint32_t &deviceId) mutable -> bool {
if (signal_protocol_key_helper_generate_registration_id(&deviceId, 0, globalContext.get()) < 0) {
warning("Device ID could not be generated");
reportFinishedResult(interface, false);
- break;
+ return false;
}
- if (!deviceIds.contains(QString::number(deviceId))) {
+ return true;
+ };
+
+ // The first generated device ID can be used if no device bundle node exists.
+ // Otherwise, duplicates must be avoided.
+ if (error) {
+ uint32_t deviceId = 0;
+ if (generateDeviceId(deviceId)) {
ownDevice.id = deviceId;
reportFinishedResult(interface, true);
- break;
+ }
+ } else {
+ const auto &deviceIds = std::get<QVector<QString>>(result);
+
+ while (true) {
+ uint32_t deviceId = 0;
+
+ if (generateDeviceId(deviceId) && !deviceIds.contains(QString::number(deviceId))) {
+ ownDevice.id = deviceId;
+ reportFinishedResult(interface, true);
+ break;
+ }
}
}
}