aboutsummaryrefslogtreecommitdiff
path: root/src/omemo/QXmppOmemoMemoryStorage.cpp
blob: 6ccf7332f22fe80cea69e65b85da60fdfb710e14 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
// SPDX-FileCopyrightText: 2022 Melvin Keskin <melvo@olomono.de>
//
// SPDX-License-Identifier: LGPL-2.1-or-later

#include "QXmppOmemoMemoryStorage.h"

#include "QXmppFutureUtils_p.h"

using namespace QXmpp::Private;

///
/// \class QXmppOmemoMemoryStorage
///
/// \brief The QXmppOmemoMemoryStorage class stores data used by
/// \xep{0384, OMEMO Encryption} in the memory.
///
/// \warning THIS API IS NOT FINALIZED YET!
///
/// \since QXmpp 1.5
///

class QXmppOmemoMemoryStoragePrivate
{
public:
    bool isSetUp = false;

    std::optional<QXmppOmemoStorage::OwnDevice> ownDevice;

    // IDs of pre key pairs mapped to pre key pairs
    QHash<uint32_t, QByteArray> preKeyPairs;

    // IDs of signed pre key pairs mapped to signed pre key pairs
    QHash<uint32_t, QXmppOmemoStorage::SignedPreKeyPair> signedPreKeyPairs;

    // recipient JID mapped to device ID mapped to device
    QHash<QString, QHash<uint32_t, QXmppOmemoStorage::Device>> devices;
};

///
/// Constructs an OMEMO memory storage.
///
QXmppOmemoMemoryStorage::QXmppOmemoMemoryStorage()
    : d(new QXmppOmemoMemoryStoragePrivate)
{
}

QXmppOmemoMemoryStorage::~QXmppOmemoMemoryStorage() = default;

/// \cond
QXmppTask<QXmppOmemoStorage::OmemoData> QXmppOmemoMemoryStorage::allData()
{
    return makeReadyTask(std::move(OmemoData { d->ownDevice,
                                               d->signedPreKeyPairs,
                                               d->preKeyPairs,
                                               d->devices }));
}

QXmppTask<void> QXmppOmemoMemoryStorage::setOwnDevice(const std::optional<OwnDevice> &device)
{
    d->ownDevice = device;
    return makeReadyTask();
}

QXmppTask<void> QXmppOmemoMemoryStorage::addSignedPreKeyPair(const uint32_t keyId, const SignedPreKeyPair &keyPair)
{
    d->signedPreKeyPairs.insert(keyId, keyPair);
    return makeReadyTask();
}

QXmppTask<void> QXmppOmemoMemoryStorage::removeSignedPreKeyPair(const uint32_t keyId)
{
    d->signedPreKeyPairs.remove(keyId);
    return makeReadyTask();
}

QXmppTask<void> QXmppOmemoMemoryStorage::addPreKeyPairs(const QHash<uint32_t, QByteArray> &keyPairs)
{
    d->preKeyPairs.insert(keyPairs);
    return makeReadyTask();
}

QXmppTask<void> QXmppOmemoMemoryStorage::removePreKeyPair(const uint32_t keyId)
{
    d->preKeyPairs.remove(keyId);
    return makeReadyTask();
}

QXmppTask<void> QXmppOmemoMemoryStorage::addDevice(const QString &jid, const uint32_t deviceId, const QXmppOmemoStorage::Device &device)
{
    d->devices[jid].insert(deviceId, device);
    return makeReadyTask();
}

QXmppTask<void> QXmppOmemoMemoryStorage::removeDevice(const QString &jid, const uint32_t deviceId)
{
    auto &devices = d->devices[jid];
    devices.remove(deviceId);

    // Remove the container for the passed JID if the container stores no
    // devices anymore.
    if (devices.isEmpty()) {
        d->devices.remove(jid);
    }

    return makeReadyTask();
}

QXmppTask<void> QXmppOmemoMemoryStorage::removeDevices(const QString &jid)
{
    d->devices.remove(jid);
    return makeReadyTask();
}

QXmppTask<void> QXmppOmemoMemoryStorage::resetAll()
{
    d.reset(new QXmppOmemoMemoryStoragePrivate());
    return makeReadyTask();
}
/// \endcond